2014-03-05 238 views
1

我有一个项目包含需要的lib(jar文件)在项目的子目录中(我将其称为myLib)。我想使用maven与myLib的依赖关系构建项目作为可执行jar,以避免ClassNotFoundException。我打算做的是使用maven-shade-plugin;然而,大多数MyLib中的依赖关系是不是在Maven仓库,所以我不知道如果我能做到这一点,而不在Maven仓库安装MyLib的罐子:maven将项目的jar库添加到可执行文件夹

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

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

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

回答

3

你不能只在你的jar中包含第三方jar。清单中的类路径相对于您正在运行的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 

现在你的问题。

首先,你应该真的把所有的库存放到一个仓库中。 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,该zip可以简单地解压缩以安装应用程序。

从一个简单的描述符Assembly Plugin的作品,你的情况,你要包括你的应用程序的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打一点)

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

相关问题