当前位置: 首页 > 知识库问答 >
问题:

Spring Boot从命令行执行向类路径添加文件

慕通
2023-03-14

我正在使用Netbeans 8.2开发Spring应用程序。我遇到麻烦的这个应用程序是一个Spring Boot1.5.3应用程序。我有一个spring xml文件和一个application.properties保存在根项目目录下的/config中。

我正在通过@ImportResource批注和诸如@ImportResource(value=“${config.xmlFile}”)之类的值属性将spring xml文件传递给我的项目。

当我单击Netbeans中的“Run Project”按钮时,我的Spring应用程序就会启动,它会正确地在我的/config文件夹中找到application.properties文件。但是,对该文件夹中其他文件的任何类路径引用都将丢失。例如,将config.xml文件设置为classpath:config/file.xmlclasspath:file.xml都无法找到该html" target="_blank">文件,但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

有没有人有什么想法或有用的提示?提前道谢!

共有1个答案

江瀚昂
2023-03-14

您可以遵循我最初回答中的实践,但我们最近放弃了这一点,转而使用一种更简单、更干净、更标准的选项(“Java”方式)。我们之所以做出更改,是因为我们需要在运行时动态加载在编译时不可用的依赖库(在它们的确切版本中)。在我们的例子中,我们希望仅从单独的文件夹加载依赖的JAR,而不是从可执行的JAR加载。我们最终在可执行jar和单独的文件夹中发现了重复的依赖项,因此我们决定删除可执行jar属性启动器,而只从单独的文件夹加载依赖项。这通常不是最好的选择,应该针对您的用例进行评估。我更喜欢阅读标准的Java类路径。

要运行一个没有可执行jar的Spring Boot应用程序,我们使用Maven Assembly将依赖的jar放在/libs目录中,并删除Spring-boot-maven-plugin。这方面的步骤和一些代码如下:

>

  • 删除以ZIP格式创建可执行jar的spring-boot-maven-plugin
  • 将以下内容添加到程序集XML中

    您希望库的位置 是否要在此处包含项目工件

    从主类运行代码,并在类路径中包含依赖的jar文件夹。在操作系统上使用标准类路径表示法,而不是自定义的、笨拙的PropertiesLauncher加载器路径语法

    java-cp

    实际调用的示例:java-cp$classpath:./lib/*:./cfg/*:my-app.jar application.class

    经过一番研究,多亏了@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应用程序时添加一个类路径,该应用程序使用以下命令运行 目前,我可以使用插入到字段中的自定义参数向maven测试添加一个classpath文件夹 然而,这种方法不适用于使用mvn spring boot:run运行应用程序

    • 问题内容: 好的,我知道这个问题以前已经被问过很多次了,但是我已经搜索了一下,查看了示例,并查看了过去一个月中关于SO的问题,我真的无法解决这个问题。我认为问题是我希望能够从Eclipse和命令行运行该程序。我也在使用OSX,我认为我正在阅读的许多示例都是针对Windows / Linux的。 如果我有一个要在命令行中运行的,在Eclipse中编译的简单程序,请执行以下操作: 我有另一个程序在Ec

    • 问题内容: 我已经编译了一个JAR文件,并在清单中指定了Main-Class(我使用了Eclipse Export函数)。我的依赖项都在标有的目录中。在指定应将JAR文件用作类路径的同时,我似乎无法获得关于如何执行我的JAR文件的直接答案。 我试过了: 等等… 每个都给出一个错误说: 或NoClassDefFoundError指示未找到库。 我什至尝试重新制作JAR文件,并包括lib目录和内容,但

    • 问题内容: 我正在运行Ubuntu,并希望通过包含多个jar文件从终端执行Java文件。 我的所有罐子都放在tha jar文件夹中。 我试过了 我得到以下错误。 谁能指导如何在classpath中使用多个jar? 问题答案: 从类路径中删除空格并添加当前路径 从Java 6开始,您可以使用类路径通配符

    • 我试图从maven命令行运行一个类,但得到以下错误。不知道我错过了什么。有谁能引导一下吗? pom.xml

    • 问题内容: 我有一个Maven项目,该项目生成一个jar文件并将所有依赖项复制到文件夹。我想在客户端计算机(Windows)上执行该项目。因此,我将复制到文件夹,并将所有依赖项复制到文件夹。如何从客户端的命令提示符下执行此项目?我尝试从文件夹中使用,但是会引发以下错误。 我想,如果我在classpath中指定所有依赖项(如),它将解决此问题,但是我不想这样做,因为我已经有40个库,并且在将来的版本