有 Java 编程相关的问题?

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

Java在执行由配置了精确类路径参数的mavenjarpluin生成的可执行jar时无法找到依赖项

以下是我的java应用程序的目录结构:

application.jar
dependency-jars
     a.jar
     b.jar
     c.jar

当我使用以下命令时,应用程序执行良好:java -cp "application.jar;dependency-jars/*" com.my.Application。除了应用程序依赖项之外,“dependency jars”文件夹的使用者还将删除JAR。我想让它成为一个可执行的jar,以便它的消费者能够轻松地调用它。为了创建可执行jar,我使用了maven jar插件。我想模拟上面的命令行。我使用了以下maven jar插件配置:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-jar-plugin</artifactId>
   <version>2.4</version>
   <configuration>
      <archive>
         <manifest>
            <mainClass>com.my.Application</mainClass>
            <addClasspath>true</addClasspath>
         </manifest>
         <manifestEntries>
            <Class-Path>dependency-jars/*</Class-Path>
         </manifestEntries>
      </archive>
   </configuration>
</plugin>

执行时生成的jar无法在运行时找到其依赖项。上面有什么问题吗

谢谢


共 (1) 个答案

  1. # 1 楼答案

    您需要将maven-assembly-plugin用于以下情况:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.4</version>
          <configuration>
            <archive>
              <manifest>
                <mainClass>com.my.Application</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
          </configuration>
          <executions>
            <execution>
              <id>make-assembly</id>
              <phase>package</phase> <!  bind to the packaging phase  >
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
    

    你用它来运行它

    mvn clean compile assembly:single
    

    应在汇编之前添加编译目标:single。通常,此目标与构建阶段相关联,以自动执行。这确保了在执行mvn安装时构建JAR

    如果不提到maven-shade-plugin,这个答案将是不完整的,它可以帮助您防止依赖项jar的包名和类名发生冲突