【问题标题】:Java not able to find dependencies while executing executable jar generated with maven-jar-pluin configured with exact classpath argumentsJava 在执行使用 maven-jar-plugin 生成的可执行 jar 时找不到依赖项,该 jar 配置了精确的类路径参数
【发布时间】:2013-11-29 15:56:32
【问题描述】:

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

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

当我使用以下命令时,应用程序执行良好:java -cp "application.jar;dependency-jars/*" com.my.Application。除了应用程序依赖项之外,“dependency-jars”文件夹还将包含由其使用者丢弃的 jars。我想让它成为一个可执行的 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 在运行时无法找到其依赖项。以上有什么问题吗。

谢谢。

【问题讨论】:

  • 我已经使用 maven-assembly-plugin 提供了答案。我过去曾使用过此解决方案,它也应该对您有用。如果您需要更多帮助,请在 cmets 中告诉我。

标签: java classpath executable-jar maven-jar-plugin


【解决方案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 install 时构建 JAR。

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

【讨论】:

  • 我正在使用 maven 依赖插件来收集“dependency-jars”文件夹中应用程序的所有依赖项。一旦部署了应用程序,我还希望允许任何人将他们的 jar 放到“dependency-jars”文件夹中。为了支持这一点,我想将“dependency-jars”文件夹显式添加到类路径中。您提供的解决方案不适用于我的情况。
  • 您能详细说明一下您的用例吗?例如,部署应用程序之后 将jar 放入dependency-jars 文件夹有什么用?如果应用程序依赖于这些 jar,那么它们应该从一开始就是包。如果已将新代码添加到需要这些依赖项的应用程序中,那么无论如何您都需要重新构建和重新部署。
  • 另外,我发现您所做的与我编写 Ant 构建脚本的方式相似。如果我冒险猜测,您的用例是否有一些 maven 存储库中不存在的依赖项(如专有 JAR)?
  • 让我简要描述一下与消费者在dependency-jars文件夹中放置jar相关的用例。我的应用程序是基于弹簧的应用程序。它以默认行为打包。但是,消费者可以通过为应用程序的已发布接口提供不同的实现来更改/覆盖它的一个或多个方面。为此,他们必须将 jar 放到文件夹中,并对 spring 上下文文件中的对象连接进行适当的更改。
  • 嗯,这听起来像是一个完全有效的用例。看起来您正在创建一个容器,就像 Tomcat 是一个 servlet 容器一样。您应该使用此用例更新问题。我确信有人已经这样做了,并且会提供一个很好的答案。
猜你喜欢
  • 2021-05-25
  • 2017-07-23
  • 2014-04-09
  • 2011-08-26
  • 1970-01-01
  • 2015-06-07
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多