Java 使用静态内容运行spring引导jar
我正在使用SpringBoot并将静态内容(html、css等)存储为Java 使用静态内容运行spring引导jar,java,maven,spring-boot,Java,Maven,Spring Boot,我正在使用SpringBoot并将静态内容(html、css等)存储为src/main/webapp。我知道不建议这样做,因为它不会存储在jar文件中(应该是/META-INF/resources/,/resources/,/static/,/public/)。但我的问题不是在jar中存储静态内容 这是项目结构: App ├──src | └───main | ├── java | | └── ... | ├── resources
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
├──src
| └───主要的
| ├── JAVA
| | └── ...
| ├── 资源
| | └── (这里所有的东西都在罐子里)
| └── webapp它在运行时相对于可执行文件的工作目录进行搜索。由于它使用相对路径来查找文件(例如,src/main/webapp/file.txt
),因此您的工作目录必须是/path/to/App
使用-Duser.dir
我建议你试试这个:
java-Duser.dir=../-jar App.jar
或者它需要一条绝对路径。告诉我它是否有效;我还没有这个项目来试用。有一种观点认为这是一个构建问题。我不是说包装问题(我知道你不想把它放进罐子里)。但是您还有另一个选择:您的构建系统(例如Maven)可以将静态文件复制到目标文件夹中
演示如何使用maven antrun plugin
调用Ant的copy
命令。这将把静态文件的副本放入target
文件夹
显然要改变执行阶段(测试阶段对于您的用例来说太具体/太晚)。
也许还可以查找是否有更专业的方法(因为委托给Ant不是超级惯用的方式)。它不起作用:“错误:找不到或加载main class.dir=../”。我还尝试了-Duser.dir=D:/App。
啊,这是Windows;也许你需要反斜杠?。\或D:\App。根据您正在使用的shell,您可能需要避开这些反斜杠:..\\or D:\\app如果对Spring Boot搜索的位置有任何不明确的地方,您可以使用来嗅探Windows上的所有文件访问。您可以查找java尝试查找失败的文件,这将告诉您它解析相对路径的绝对路径。这将指示-Duser.dir
是否有任何效果(只需稍加调整),或者它是否是一条死胡同。我认为-Duser.dir
有效果,因为现在我有一个错误:找不到或加载主类org.springframework.boot.loader.JarLauncher。@Birchlabs我想你需要合并这两个答案:)这个插件正在复制单个文件。我发现了maven资源插件
,它可以将多个资源目录复制到独立的目录,但我认为这不是一个好的解决方案。我正在考虑像你建议的那样更改工作目录,但我认为这是一个死胡同。出于好奇:你为什么不认为构建是解决这个问题的好方法<代码>目标
是项目的输出。您想要发送或运行的所有内容都应该输出到该文件夹中。你不喜欢这些文件的副本吗?你不喜欢让他们跟上时代吗?无论源代码何时更改,都应该调用build,所以很容易保持最新。否则:ant copy任务可以创建符号链接(尽管我不推荐)。好吧,我同意你的看法。没那么糟糕:)我成功地将webapp
文件夹手动复制到target/src/main
。所以我想你选择maven插件也可以。我想知道这是唯一的办法吗?我找到了spring.resources.static locations
属性,但不确定应该有什么。嗯,我认为spring.resources.static locations
不能用于指定绝对路径。它的默认值是/**
,但这似乎是指类路径的根,或者可能是指usr.dir
的根。我认为你无法从那里向上导航。我认为将静态文件复制到目标文件夹是最简单的解决方案。非常感谢。