JavaSpring引导从命令行执行向类路径添加文件
我正在使用Netbeans 8.2开发Spring应用程序。这个我遇到麻烦的特定应用程序是Spring Boot 1.5.3应用程序。我有一个SpringXML文件和一个应用程序。保留在根项目目录下的/config中的属性
我通过@ImportResource
注释和类似@ImportResource(value="${config.xmlfile}")
的值属性将SpringXML文件传递给我的项目
当我在Netbeans中单击“运行项目”按钮时,我的Spring应用程序启动,它正确地找到了应用程序。my/config文件夹中的属性文件。但是,对该文件夹中其他文件的任何类路径引用都将丢失。例如,设置配置。指向classpath:config/file.xml
或classpath:file.xml
的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>
和我的应用程序运行。sh脚本执行以下操作:
exec /bin/java -cp :.:../config/*:../app-exec.jar
-Dlogging.config=../config/log4j2.xml
-Dspring.config.location=../config/application.properties
-jar ../app-exec.jar
where/bin/java表示我安装java的位置。在-cp中设置的类路径在这里似乎不起作用。类似于在IDE中运行时,设置配置。xml文件到类路径:config/file。xml或类路径:文件。xml都找不到文件,但文件:/config/file。xml有效
我希望能够在IDE和from命令行中设置类路径,这样我就可以在Spring中使用类路径引用访问文件,从而使事情变得更简单。我不想将它们全部放在src/main/resources
中,并将它们打包在jar中,因为我需要在打包和部署之后编辑它们
有人有什么想法或有用的提示吗?提前谢谢
# 1 楼答案
最新答案:
您可以按照我最初的答案中的做法进行操作,但我们最近放弃了这个选项,因为它更简单、更清晰,更标准(“Java”方式)。我们之所以做出更改,是因为我们需要在运行时动态加载编译时不可用的依赖库(精确版本)。在我们的例子中,我们只想从单独的文件夹加载依赖jar,而不是从可执行jar加载。我们最终在可执行jar和单独的文件夹中有重复的依赖项,所以我们决定放弃可执行jar属性启动器,而只从单独的文件夹加载依赖项。这通常是而不是最佳选项,应该根据您的用例进行评估。我更喜欢阅读标准Java类路径
为了在没有可执行jar的情况下运行Spring Boot应用程序,我们使用Maven Assembly将依赖jar放在/libs目录中,并删除了Spring Boot Maven插件。其步骤和一些代码如下:
将以下内容添加到程序集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插件中添加了以下内容,这样当我从命令行运行时,它会使用
PropertiesLauncher
而不是JarLauncher
:有关
PropertiesLauncher
选项的更多信息,请参见here和here。它允许您设置类路径等。 参见here、here和here了解我在哪里找到这个问题的答案。使用format ZIP可以使用PropertiesLauncher
从那时起,我可以使用这个命令按我的预期启动应用程序:
另一个重要注意事项是:在指定
-Dloader.path
时,确保使用逗号分隔的值,并且只使用目录和文件,如here所述。此外,请确保在指定-jar之前放置-D参数,否则它们将不会被设置如果任何人有任何建议或编辑,以进一步改进此答案或原始问题,以帮助其他用户,请让我知道或自己进行编辑
# 2 楼答案
如果你不把文件放在
src/main/resources
中,那么你可以把它放在任何你想要的文件夹中,但是你必须把你的文件夹设置为资源文件夹。因为classpath
总是指向资源文件夹。一旦你把文件夹变成资源文件夹,它就会被打包到jar中。如果您想编辑资源文件,只需使用7 zip tool打开jar->;编辑文件->;保存->;它会更新你在罐子里的变化另一种解决方案是创建一个文件夹,将所有要编辑且未打包的文件放入其中,然后每次运行时手动将类路径设置到该文件夹,但上面设置的方式不正确,请尝试this解决方案以获得设置类路径的正确方式