2017-06-20 43 views
2

我使用Netbeans 8.2开发Spring应用程序。我遇到麻烦的这个特定的应用程序是一个Spring Boot 1.5.3应用程序。我有一个spring xml文件和一个application.properties,它们保存在根项目目录下的/ config中。Spring Boot将文件从命令行执行添加到类路径

我通过@ImportResource注释和像@ImportResource(value="${config.xmlfile}")这样的值属性将弹簧xml文件传递到我的项目。

当我点击NetBeans中的“运行项目”按钮时,我的Spring应用程序启动并正确找到我的/ config文件夹中的application.properties文件。但是,对该文件夹中其他文件的任何类路径引用都将丢失。例如,将config.xml文件设置为classpath:config/file.xmlclasspath: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 

where/bin/java repres发送我安装了java的位置。在-cp中设置的类路径在这里似乎不起作用。同样通过IDE中运行时,设置config.xml文件中的类路径:配置/ file.xml或类路径:file.xml都无法找到该文件,但文件:../配置/ file.xml作品。

我希望能够将classpath设置在IDE和命令行,这样我可以在Spring中使用的类路径参照使事情更容易访问文件。我不想将它们都放在src/main/resources中,并将它们打包在jar中,因为我需要在打包和部署后对它们进行编辑。

有没有人有任何想法或有帮助的提示?提前致谢!

回答

4

一些经过研究,并感谢@ TuyenNguyen的有用的答案,我能够得到以下工作:

我说,这样,当我在命令行中运行以下命令以我的春天启动了Maven插件它使用PropertiesLauncher代替JarLauncher

<configuration> 
    <mainClass>${mainClass}</mainClass> 
    <layout>ZIP</layout> //THIS IS THE IMPORTANT PART 
</configuration> 

更多有关PropertiesLauncher选项见herehere。它允许你设置类路径等等。 请参阅here,herehere,我找到了解决此问题的答案。使用格式ZIP可以使用PropertiesLauncher

从那里,我可以使用这个命令来启动该应用程序,因为我打算:

java -Dloader.path=../config,../ -Dloader.config.location=classpath:application.properties -jar ../app-exec.jar 

另一个重要提示:指定-Dloader.path时请务必使用逗号分隔值,只有目录和文件如here所述。此外,请务必在指定-jar jar之前放置-D参数,否则它们将不会被设置。

如果有人有任何建议或修改,以进一步改善这个答案或原来的问题,以帮助更多的用户,请让我知道或编辑自己!

+1

感谢您的详细注释。它在命令中更改了-Dloader.path的位置之后起作用。 – Silentbang

+1

@Silentbang很高兴这个答案帮了我一些忙,弄明白了。 Spring的这个主题领域的文档很不错,但在某些地方破坏了惯例,比如在传递给'-Dloader.path'时如何指定路径 – wrslatz

1

如果你不把你的文件src/main/resources,那么你可以把它放在任何你想要的文件夹中,但你必须设置你的文件夹作为一个资源文件夹中。因为classpath始终指向资源文件夹。一旦你将你的文件夹作为资源文件夹,它将被打包到jar中。如果你要编辑的资源文件,只是用7 zip tool打开你的罐子 - >编辑文件 - >保存 - >将更新您的罐子变化。

另一种解决方法是创建一个文件夹,将所有需要编辑但未打包的文件放入该文件夹中,然后在每次运行时手动将该类路径设置为该文件夹,但是您上面设置的方式不正确,请尝试this解决方案设置classpath正确的方式。

+0

谢谢,您提供的第二个选项看起来像是合适的解决方案。但是,鉴于这是一个重新包装的Spring Boot应用程序,我没有那么容易访问jar的内部类。我的main()类已经被重新打包,所以我不能像第二个例子那样访问它。我将查看是否可以使用[PropertiesLauncher](如此处所述)(https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable) -jar-property-launcher-features) – wrslatz

相关问题