maven将项目的jar lib添加到可执行jar

时间:2014-03-05 08:04:11

标签: java maven jar dependencies executable-jar

我有一个项目,在项目的子目录(我将其称为myLib)中包含所需的lib(jar文件)。我想使用maven和myLib中的依赖项将项目构建为可执行jar,以避免ClassNotFoundException。我打算做的是使用maven-shade-plugin;但是,myLib中的大多数依赖项都不在maven存储库中,因此我不确定如果不在maven存储库中安装myLib的jar文件就可以执行此操作:

    <artifactSet>
        <include>groupId:artifactId</include>
    <artifactSet>

是否有可能maven将这些“myLib依赖项”包含在打包的可执行jar中,而无需使用mvn install:install安装它们到maven存储库?

我还尝试通过在src / main / resources /中移动它们来添加myLibs jar,因此它们将被添加到可执行jar文件中但我无法通过在我的Manifest的Class-Path头中添加它们来引用它们docs.oracle.com/javase/tutorial/deployment/jar/downman.html中提到的文件。

1 个答案:

答案 0 :(得分:3)

你不能只在你的罐子里加入第三方罐子。清单中的类路径是相对于您正在运行的jar。

例如,如果您my-application.jar依赖于my-utils.jar且两者都在同一目录中,那么您的清单类路径将为:

Class-Path: my-utils.jar

如果你只是将my-utils.jar移动到lib目录,给我这个布局:

+ my-application.jar
+ lib
  + my-utils.jar

您的清单类路径为:

Class-Path: lib/my-utils.jar  

现在你的问题。

首先,你应该把所有的lib放到存储库中。 Maven是为了在存储库中工作而构建的,并且反对“Maven方式”通常会导致以后出现问题。

备选方案(我不建议)是使用system范围声明依赖关系,这允许您指定路径,例如:

<dependency>
  <groupId>com.mycompany</groupId>
  <artifactId>my-utils</artifactId>
  <version>1.0</version>
  <scope>system</scope>
  <systemPath>lib/my-utils.jar</systemPath>
</dependency>

但是,请谨慎使用。 system范围旨在与系统jar一起使用,通常是JVM中的系统jar。将它与其他任何东西一起使用实际上是对此功能的滥用,并且可能会影响您构建的可移植性。

直接拥有依赖项后,您需要打包应用程序。正如我所提到的,包括应用程序jar中的依赖项jar将无法正常工作。我通常使用允许我创建zip的Assembly Plugin,只需解压缩即可安装应用程序。

Assembly Plugin来自一个简单的描述符,在你想要包含你的应用程序jar和依赖jar的情况下,它将如下所示:

<?xml version="1.0"?>

<assembly
  xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"
>

  <id>${project.name}</id>

  <formats>
    <format>zip</format>
    <format>dir</format>
  </formats>

  <includeBaseDirectory>false</includeBaseDirectory>

  <dependencySet>
    <outputDirectory>lib</outputDirectory>
    <useProjectArtifact>true</useProjectArtifact>
    <includes>
      <include>${artifact.groupId}:${artifact.artifactId}</include>
    </includes>
  </dependencySet>

  <dependencySet>
    <outputDirectory>lib</outputDirectory>
    <useProjectArtifact>false</useProjectArtifact>
  </dependencySet>

</assembly>

(您可能需要稍微使用include

您还可以包含运行应用程序的脚本以及程序集中所需的属性。