【问题标题】:Run spring boot jar with static content使用静态内容运行 spring boot jar
【发布时间】:2018-02-14 20:03:20
【问题描述】:

我正在使用 Spring Boot 并将我的静态内容(html、css 等)存储为 src/main/webapp。我知道不推荐这样做,因为它不会存储在 jar 文件中(应该在/META-INF/resources//resources//static//public/)。但我的问题不在于将静态内容存储在 jar 中。

这是项目结构:

App
 ├──src
 |   └───main
 |        ├── java
 |        |     └── ...
 |        ├── resources
 |        |     └── (everything here will be in jar)
 |        └── webapp <- this won't be in jar
 |               └── ...
 └ target
     └───App.jar

当我尝试从App 文件夹中以java -jar target/App.jar 运行jar 时,spring boot 会找到静态内容并且工作正常。但是从target 文件夹中以java -jar App.jar 运行它不会找到静态内容。

如何从目标文件夹运行App.jar,让spring boot找到静态内容?它与类路径有关吗?我试图用-cp 选项指定类路径,但它不起作用。

【问题讨论】:

    标签: java maven spring-boot


    【解决方案1】:

    它在运行时相对于可执行文件的工作目录进行搜索。由于它使用相对路径来查找文件(例如src/main/webapp/file.txt),因此您的工作目录需要为/path/to/App

    You can change the working directory 使用 -Duser.dir

    我建议试试这个:

    java -Duser.dir=../ -jar App.jar
    

    或者它可能需要是一个绝对路径。告诉我它是否有效;我还没有项目可以试用。

    【讨论】:

    • 它不起作用:“错误:无法找到或加载主类 .dir=../”。我也试过-Duser.dir=D:/App.
    • 啊,是Windows;也许你需要反斜杠? ..\ 或 D:\App。根据您使用的 shell,您可能需要转义这些反斜杠:..\\ 或 D:\\App
    • 如果 Spring Boot 正在搜索的 哪里 有任何歧义,您可以使用 ProcMon 窥探 Windows 上的所有文件访问。您可以查找 java 尝试查找失败的文件,这应该告诉您它解析相对路径的绝对路径。这将表明-Duser.dir 是否具有任何 效果(只需稍作调整),或者它是否是死胡同。
    • 我认为-Duser.dir 正在生效,因为现在我遇到了这个错误:无法找到或加载主类 org.springframework.boot.loader.JarLauncher。
    • @Birchlabs 我认为您需要合并这两个答案,:)
    【解决方案2】:

    有观点认为这是一个构建问题。我不是指包装 问题(我知道你不想把它放进罐子里)。但是您还有另一个选择:您的构建系统(例如 Maven)可以将静态文件复制到目标文件夹中。

    This answer 演示了使用maven-antrun-plugin 来调用Ant 的copy 命令。这会将您的静态文件的副本放入target 文件夹中。

    显然更改执行阶段(测试阶段对于您的用例来说太具体/太晚了)。 并且也许查找是否有更 Maveny 的方式来做到这一点(因为委托给 Ant 不是超级惯用的)。

    【讨论】:

    • 这个插件正在复制单个文件。我找到了maven-resources-plugin,它可以将多个资源目录复制到独立的目录,但我认为这不是一个好的解决方案。我正在考虑按照您的建议更改工作目录,但认为这是一个死胡同。
    • 出于好奇:您为什么不认为 build 是解决此问题的好方法? target 是您项目的输出。您想要 shiprun 的所有内容都应该输出到该文件夹​​中。你不喜欢有文件的副本吗?你不喜欢让它们保持最新吗? build 应该在源代码更改时调用,因此很容易保持最新状态。否则:蚂蚁复制任务可以创建符号链接(虽然我不推荐它)。
    • 好吧,我同意你的看法。还不错:) 我能够通过手动将webapp 文件夹复制到target/src/main 来成功。所以我猜你的 Maven 插件选项也可以正常工作。我想知道这是唯一的方法吗?我找到了spring.resources.static-locations 属性,但不确定应该在那里。
    • hm,我觉得spring.resources.static-locations不能用来指定绝对路径。它的默认值是/**,但这似乎是指类路径的根目录,或者可能是usr.dir 的根目录。我认为您无法从那里向上导航。
    • 我认为将静态文件复制到目标文件夹是最简单的解决方案。谢谢
    猜你喜欢
    • 2018-02-10
    • 2014-02-16
    • 2016-12-20
    • 1970-01-01
    • 2018-06-26
    • 2017-07-19
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多