我有一个 Maven 生成的jar,其中包含名为lib
的目录中的所有依赖项jar。
app-0.0.1-SNAPSHOT.jar
|_ lib/
|_ app.properties
|_ app/
|_ spring/
但是,当我使用以下命令行运行它时:
java -jar app-0.0.1-SNAPSHOT.jar
它抱怨它无法找到 slf4j (实际上它包含在目录lib
中)。基本上,它无法识别lib
目录。
此jar使用 maven-dependency-plugin 和 maven-jar-plugin 按照this solution创建。正如解决方案所示,必须使用自定义类加载代码来加载jar。我想知道这个类加载代码应该是什么样的。
MANIFEST.MF在
Manifest-Version: 1.0
Built-By: me
Build-Jdk: 1.6.0_26
Class-Path: lib/camel-core-2.6.0.jar lib/commons-logging-api-1.1.jar ...
Created-By: Apache Maven 3.1.1
Main-Class: app.Main
Archiver-Version: Plexus Archiver
答案 0 :(得分:1)
在答案中展示这一点可能更容易,而不是广泛的评论......
您有两种方法可以完成您想要的任务:
要做#1,您可以使用maven-assembly-plugin
使用POM中的以下内容构建包含所有依赖项的jar文件:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>${main.class}</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
这个罐子里的清单看起来像这样:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: <username>
Build-Jdk: 1.7.0_60
Main-Class: your.main.Class
使用此解决方案,您的类路径上不需要一堆jar,因为它们已经在 jar中,位于正确的包位置(.class格式)< / p>
如果你选择#2,解决方案应该为你提供这样的东西(假设你lib
目录中名为target
的目录中有所有依赖项
your.artifact.jar
lib
|-- dependent jars...
你的罐子的清单会有:
Manifest-Version: 1.0
Built-By: me
Build-Jdk: 1.6.0_26
Class-Path: lib/camel-core-2.6.0.jar lib/commons-logging-api-1.1.jar ...
Created-By: Apache Maven 3.1.1
Main-Class: app.Main
Archiver-Version: Plexus Archiver
请注意,lib目录不是在你的jar中,而是与它一起打包(即你自己将它们一起分发)