如何运行包含依赖库的jar?

时间:2015-03-11 19:48:40

标签: java maven jar

我有一个 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

1 个答案:

答案 0 :(得分:1)

在答案中展示这一点可能更容易,而不是广泛的评论......

您有两种方法可以完成您想要的任务:

  1. 创建一个包含
  2. 所有依赖项的jar文件
  3. 创建一个独立的jar,它只包含工件的资源和类,但没有依赖项。依赖的罐子放在罐子旁边的某个目录中。
  4. 要做#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中,而是与它一起打包(即你自己将它们一起分发)