2014-03-05 209 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打一點)

您還可以包含腳本來運行您的應用程序和程序集中所需的屬性。

相關問題