Spring 从命令行执行引导将文件添加到类路径
Spring Boot add files to classpath from command line execution
我正在使用 Netbeans 8.2 开发 Spring 应用程序。我遇到问题的这个特定应用程序是 Spring Boot 1.5.3 应用程序。我有一个 spring xml 文件和一个 application.properties 保存在根项目目录下的 /config 中。
我正在通过 @ImportResource
注释和值 属性 将 spring xml 文件传递到我的项目,例如 @ImportResource(value="${config.xmlfile}")
.
当我在 Netbeans 中单击 'Run Project' 按钮时,我的 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
制作罐子如下:
<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 中设置的类路径在这里似乎不起作用。类似于当 运行 通过 IDE 时,将 config.xml 文件设置为类路径:config/file.xml 或 classpath:file.xml两者都找不到文件,但文件:../config/file.xml 有效。
我希望能够在 IDE 和命令行中设置类路径,以便我可以使用类路径引用访问 Spring 中的文件,从而使事情变得更容易。我不想将它们全部放入 src/main/resources
并将它们打包到 jar 中,因为我需要在打包和部署后编辑它们。
有没有人有任何想法或有用的提示?提前致谢!
如果您不将文件放在 src/main/resources
中,那么您可以将其放在您想要的任何文件夹中,但您必须将您的文件夹设置为资源文件夹。因为 classpath
总是指向资源文件夹。将文件夹设为资源文件夹后,它将被打包到 jar 中。如果你想编辑你的资源文件,只需使用 7 zip tool 打开你的 jar -> 编辑文件 -> 保存 -> 它会更新你在 jar 中的更改。
另一种解决方法是创建一个文件夹,把所有你想编辑而不是打包的文件放在里面,然后每次你手动设置类路径到那个文件夹运行,但是你上面的设置方式不正确, 尝试 this 设置类路径正确方法的解决方案。
更新后的答案:
您可以按照我原来的回答中的做法进行操作,但我们最近放弃了这个,取而代之的是更标准的更简单、更清晰的选项("Java" 方式)。我们进行更改是因为我们需要在 运行 时动态加载在编译时(在其确切版本中)不可用的依赖库。在我们的例子中,我们只想从单独的文件夹而不是可执行 jar 加载相关的 jar。我们最终在可执行 jar 和单独的文件夹中有重复的依赖项,因此我们决定删除可执行 jar Properties Launcher,而只从单独的文件夹加载依赖项。这通常 不是 最佳选择,应该针对您的用例进行评估。我更喜欢阅读标准 Java classpath.
为了 运行 没有可执行 jar 的 Spring 引导应用程序,我们使用 Maven Assembly 将依赖的 jar 放在 /libs 目录中并删除 spring-boot-maven -插入。下面是步骤和一些代码:
- 删除 spring-boot-maven-plugin 以 ZIP 格式创建可执行 jar
将以下内容添加到您的程序集中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>
运行 来自主 class 的代码,并在 class 路径中包含相关的 jar 文件夹。在 OS 上使用标准 class 路径表示法,而不是自定义的、笨拙的 PropertiesLauncher 加载程序路径语法
java -cp <standard-classpath> <main-class>
实际调用示例:
java -cp $CLASSPATH:./lib/*:./cfg/*:my-app.jar Application.class
通过这种方式,您可以通过标准 java 执行调用执行 Spring 启动应用程序,无需自定义 Spring 加载语法。您只需要确保您的所有依赖项在 运行 时间在 class 路径上可用。我们发现这更易于维护,并将其作为我们所有应用程序的标准。
原回答:
经过一些研究,多亏了@TuyenNguyen 的有用回答,我才能够进行以下工作:
我将以下内容添加到我的 spring-boot-maven-plugin 中,这样当我从命令行 运行 时,它使用 PropertiesLauncher
而不是 JarLauncher
:
<configuration>
<mainClass>${mainClass}</mainClass>
<layout>ZIP</layout> //THIS IS THE IMPORTANT PART
</configuration>
有关 PropertiesLauncher
选项的更多信息,请参阅 here and here。它允许您设置 class 路径等。
请参阅 here, here, and here 以了解我在哪里找到了此问题的答案。使用 ZIP 格式可以使用 PropertiesLauncher
。
从那里,我能够使用此命令按预期启动应用程序:
java -Dloader.path=../config,../ -Dloader.config.location=classpath:application.properties -jar ../app-exec.jar
另一个重要说明:在指定 -Dloader.path
时,请确保使用逗号分隔值并且仅使用目录和文件,如 here 所述。此外,请务必在指定 -jar jar 之前添加 -D args,否则它们将不会被设置。
如果有人有任何建议或修改以进一步改进此答案或原始问题以帮助其他用户,请告诉我或自己进行修改!
我正在使用 Netbeans 8.2 开发 Spring 应用程序。我遇到问题的这个特定应用程序是 Spring Boot 1.5.3 应用程序。我有一个 spring xml 文件和一个 application.properties 保存在根项目目录下的 /config 中。
我正在通过 @ImportResource
注释和值 属性 将 spring xml 文件传递到我的项目,例如 @ImportResource(value="${config.xmlfile}")
.
当我在 Netbeans 中单击 'Run Project' 按钮时,我的 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
制作罐子如下:
<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 中设置的类路径在这里似乎不起作用。类似于当 运行 通过 IDE 时,将 config.xml 文件设置为类路径:config/file.xml 或 classpath:file.xml两者都找不到文件,但文件:../config/file.xml 有效。
我希望能够在 IDE 和命令行中设置类路径,以便我可以使用类路径引用访问 Spring 中的文件,从而使事情变得更容易。我不想将它们全部放入 src/main/resources
并将它们打包到 jar 中,因为我需要在打包和部署后编辑它们。
有没有人有任何想法或有用的提示?提前致谢!
如果您不将文件放在 src/main/resources
中,那么您可以将其放在您想要的任何文件夹中,但您必须将您的文件夹设置为资源文件夹。因为 classpath
总是指向资源文件夹。将文件夹设为资源文件夹后,它将被打包到 jar 中。如果你想编辑你的资源文件,只需使用 7 zip tool 打开你的 jar -> 编辑文件 -> 保存 -> 它会更新你在 jar 中的更改。
另一种解决方法是创建一个文件夹,把所有你想编辑而不是打包的文件放在里面,然后每次你手动设置类路径到那个文件夹运行,但是你上面的设置方式不正确, 尝试 this 设置类路径正确方法的解决方案。
更新后的答案:
您可以按照我原来的回答中的做法进行操作,但我们最近放弃了这个,取而代之的是更标准的更简单、更清晰的选项("Java" 方式)。我们进行更改是因为我们需要在 运行 时动态加载在编译时(在其确切版本中)不可用的依赖库。在我们的例子中,我们只想从单独的文件夹而不是可执行 jar 加载相关的 jar。我们最终在可执行 jar 和单独的文件夹中有重复的依赖项,因此我们决定删除可执行 jar Properties Launcher,而只从单独的文件夹加载依赖项。这通常 不是 最佳选择,应该针对您的用例进行评估。我更喜欢阅读标准 Java classpath.
为了 运行 没有可执行 jar 的 Spring 引导应用程序,我们使用 Maven Assembly 将依赖的 jar 放在 /libs 目录中并删除 spring-boot-maven -插入。下面是步骤和一些代码:
- 删除 spring-boot-maven-plugin 以 ZIP 格式创建可执行 jar
将以下内容添加到您的程序集中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>
运行 来自主 class 的代码,并在 class 路径中包含相关的 jar 文件夹。在 OS 上使用标准 class 路径表示法,而不是自定义的、笨拙的 PropertiesLauncher 加载程序路径语法
java -cp <standard-classpath> <main-class>
实际调用示例:
java -cp $CLASSPATH:./lib/*:./cfg/*:my-app.jar Application.class
通过这种方式,您可以通过标准 java 执行调用执行 Spring 启动应用程序,无需自定义 Spring 加载语法。您只需要确保您的所有依赖项在 运行 时间在 class 路径上可用。我们发现这更易于维护,并将其作为我们所有应用程序的标准。
原回答:
经过一些研究,多亏了@TuyenNguyen 的有用回答,我才能够进行以下工作:
我将以下内容添加到我的 spring-boot-maven-plugin 中,这样当我从命令行 运行 时,它使用 PropertiesLauncher
而不是 JarLauncher
:
<configuration>
<mainClass>${mainClass}</mainClass>
<layout>ZIP</layout> //THIS IS THE IMPORTANT PART
</configuration>
有关 PropertiesLauncher
选项的更多信息,请参阅 here and here。它允许您设置 class 路径等。
请参阅 here, here, and here 以了解我在哪里找到了此问题的答案。使用 ZIP 格式可以使用 PropertiesLauncher
。
从那里,我能够使用此命令按预期启动应用程序:
java -Dloader.path=../config,../ -Dloader.config.location=classpath:application.properties -jar ../app-exec.jar
另一个重要说明:在指定 -Dloader.path
时,请确保使用逗号分隔值并且仅使用目录和文件,如 here 所述。此外,请务必在指定 -jar jar 之前添加 -D args,否则它们将不会被设置。
如果有人有任何建议或修改以进一步改进此答案或原始问题以帮助其他用户,请告诉我或自己进行修改!