有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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.xmlclasspath: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中,因为我需要在打包和部署之后编辑它们

有人有什么想法或有用的提示吗?提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    最新答案:

    您可以按照我最初的答案中的做法进行操作,但我们最近放弃了这个选项,因为它更简单、更清晰,更标准(“Java”方式)。我们之所以做出更改,是因为我们需要在运行时动态加载编译时不可用的依赖库(精确版本)。在我们的例子中,我们只想从单独的文件夹加载依赖jar,而不是从可执行jar加载。我们最终在可执行jar和单独的文件夹中有重复的依赖项,所以我们决定放弃可执行jar属性启动器,而只从单独的文件夹加载依赖项。这通常是而不是最佳选项,应该根据您的用例进行评估。我更喜欢阅读标准Java类路径

    为了在没有可执行jar的情况下运行Spring Boot应用程序,我们使用Maven Assembly将依赖jar放在/libs目录中,并删除了Spring Boot Maven插件。其步骤和一些代码如下:

    1. 删除spring boot maven插件,该插件以ZIP格式创建可执行jar
    2. 将以下内容添加到程序集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>

    3. 从主类运行代码,并在类路径上包含从属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

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

    有关PropertiesLauncher选项的更多信息,请参见herehere。它允许您设置类路径等。 参见hereherehere了解我在哪里找到这个问题的答案。使用format ZIP可以使用PropertiesLauncher

    从那时起,我可以使用这个命令按我的预期启动应用程序:

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

    另一个重要注意事项是:在指定-Dloader.path时,确保使用逗号分隔的值,并且只使用目录和文件,如here所述。此外,请确保在指定-jar之前放置-D参数,否则它们将不会被设置

    如果任何人有任何建议或编辑,以进一步改进此答案或原始问题,以帮助其他用户,请让我知道或自己进行编辑

  2. # 2 楼答案

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

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