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

Java在执行maven jar pluin生成的可执行jar时无法找到依赖项,该jar配置了精确的类路径参数,java,classpath,executable-jar,maven-jar-plugin,Java,Classpath,Executable Jar,Maven Jar Plugin,以下是我的java应用程序的目录结构: application.jar dependency-jars a.jar b.jar c.jar 当我使用以下命令时,应用程序执行良好:java-cp“application.jar;dependency jars/*”com.my.application。除了应用程序依赖项之外,“dependency jars”文件夹的使用者还将删除JAR。我想让它成为一个可执行的jar,以便它的消费者能够轻松地调用它。为了创建可执行j

以下是我的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>

org.apache.maven.plugins
maven jar插件
2.4
com.my.Application
真的
依赖罐子/*
执行时生成的jar无法在运行时找到其依赖项。上面有什么问题吗

谢谢。

您需要使用,例如:


org.apache.maven.plugins

如果依赖项JAR的包名和类名有冲突,这可以帮助您解决问题。

我使用maven assembly插件提供了一个答案。我过去使用过这个解决方案,它也应该适用于您。如果您需要更多帮助,请在评论中告诉我。我正在使用maven dependency plugin收集“dependency jars”文件夹中应用程序的所有依赖项。我还想允许任何人在部署应用程序后将其JAR放在“dependency jars”文件夹中。为了支持这一点,我想将“dependency jars”文件夹显式地添加到类路径中。您提供的解决方案在我的案例中不起作用。请您详细说明一下您的用例好吗?例如,部署应用程序后,在dependency jars文件夹中删除jar有什么用?如果应用程序依赖于这些jar,那么从一开始就应该是包。如果已经向需要这些依赖项的应用程序添加了新代码,那么无论如何都需要重建和重新部署。此外,我发现您所做的与我编写Ant构建脚本的方式类似。如果我冒昧猜测一下,您的用例中是否存在一些maven存储库中不存在的依赖项(如专有jar)?让我简要描述一下与消费者将jar放入dependency JARs文件夹相关的用例。我的应用程序是一个基于spring的应用程序。它使用默认行为打包。但是,使用者可以通过为应用程序的已发布接口提供不同的实现来更改/覆盖它的一个或多个方面。为此,他们必须将jar放到文件夹中,并对spring context file.hmm中对象的连接进行适当的更改,这听起来像是一个非常有效的用例。看起来您正在创建一个容器,就像Tomcat是一个servlet容器一样。您应该用这个用例更新这个问题。我相信有人已经这样做了,并将提供一个很好的答案。