Spring Boot从命令行执行将文件添加到类路径
我正在使用Netbeans 8.2开发Spring应用程序。我遇到麻烦的这个特定应用是Spring Boot 1.5.3应用。我有一个Spring
xml文件和一个application.properties,该文件保存在根项目目录下的/ config中。
我正在通过@ImportResource
注释和value属性(例如)将spring
xml文件传递到我的项目@ImportResource(value="${config.xmlfile}")
。
当我单击Netbeans中的“运行项目”按钮时,我的Spring应用程序启动,并且可以正确地在我的/
config文件夹中找到application.properties文件。但是,对该文件夹中其他文件的所有类路径引用都会丢失。例如,将config.xml文件设置为classpath:config/file.xml
或classpath:file.xml
都不能找到该文件但file:config/file.xml
可以。
同样,从命令行运行时,我的结构如下:
app/|-- bin
| `-- app-run.sh
|-- config
| |-- application.properties
| |-- log4j2.xml
| |-- file.xml
`-- app-exec.jar
我使用spring-boot-maven-plugin
来制作jar,如下所示:
<plugin> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
我的app-run.sh脚本执行以下操作:
exec /bin/java -cp :.:../config/*:../app-exec.jar -Dlogging.config=../config/log4j2.xml
-Dspring.config.location=../config/application.properties
-jar ../app-exec.jar
/ bin /
java代表我安装Java的位置。在-cp中设置的classpath在这里似乎不起作用。与通过IDE运行时类似,将config.xml文件设置为classpath:config
/ file.xml或classpath:file.xml都无法找到该文件,但是file:../ config / file.xml可以工作。
我希望能够在IDE和命令行中设置类路径,以便我可以使用类路径引用访问Spring中的文件,从而使事情变得更容易。我不想将它们全部放入src/main/resources
并打包在jar中,因为我需要在打包和部署后对其进行编辑。
有人有任何想法或有用的提示吗?提前致谢!
回答:
回答:
您可以按照我的原始答案中的方法进行操作,但是最近我们放弃了此方法,以便使用更简单,更干净的选项,该选项更加标准(“
Java”方式)。之所以进行更改,是因为我们需要在运行时动态加载依赖库,而这些库在编译时不可用(确切版本)。在我们的案例中,我们只想从单独的文件夹而不是从可执行jar加载依赖的jar。我们最终在可执行jar和单独的文件夹中有重复的依赖项,因此我们决定删除可执行jar的Properties
Launcher,而是仅从单独的文件夹加载依赖项。这通常 最佳选择,应该针对您的用例进行评估。我更喜欢阅读标准的Java类路径。
为了在没有可执行jar的情况下运行Spring Boot应用程序,我们使用Maven Assembly将相关的jar放在/
libs目录中,并删除了spring-boot-maven-plugin。步骤和一些代码如下:
- 删除以ZIP格式创建可执行jar的spring-boot-maven-plugin
- 将以下内容添加到您的程序集XML中
<dependencySets> <dependencySet> <outputDirectory>where you want the libs to
go</outputDirectory> <useProjectArtifact>whether you want to include the
project artifact here</useProjectArtifact> </dependencySet> </dependencySets>
- 从主类运行您的代码,并在类路径上包含相关的jar文件夹。在操作系统上使用标准的类路径符号,而不要使用自定义的,笨拙的PropertiesLauncher加载程序路径语法
java -cp <standard-classpath> <main-class>
实际通话的示例: java -cp $CLASSPATH:./lib/*:./cfg/*:my-app.jar Application.class
这样,您就可以通过标准的Java执行调用来执行Spring
Boot应用程序,而无需自定义Spring加载语法。您只需要确保在运行时在类路径上可以使用所有依赖项。我们发现这更容易维护,并使其成为我们所有应用程序的标准。
回答:
经过一些研究,并感谢@TuyenNguyen的有用回答,我得以完成以下工作:
我在spring-boot-maven-
plugin中添加了以下内容,以便从命令行运行时使用PropertiesLauncher
而不是JarLauncher
:
<configuration> <mainClass>${mainClass}</mainClass>
<layout>ZIP</layout> //THIS IS THE IMPORTANT PART
</configuration>
有关选项的更多信息,请参见此处和此处PropertiesLauncher
。它使您可以设置类路径。见这里,这里和这里的,我找到了答案,这个问题。使用ZIP格式PropertiesLauncher
可以使用。
从那里,我能够使用此命令按预期启动应用程序:
java -Dloader.path=../config,../ -Dloader.config.location=classpath:application.properties -jar ../app-exec.jar
另一个重要的注意事项:指定时-Dloader.path
务必以致用逗号分隔值,只有目录和文件,描述在这里。另外,请确保在指定-jar jar之前放置-D参数,否则将不会设置它们。
如果有人有任何建议或修改内容以进一步改善此答案或原始问题,以帮助其他用户,请让我知道或进行修改!
以上是 Spring Boot从命令行执行将文件添加到类路径 的全部内容, 来源链接: utcz.com/qa/407863.html