2012-11-13 71 views
7

我有一個依賴Maven的:添加本地依賴於罐子

<dependency> 
     <groupId>de.matthiasmann</groupId> 
     <artifactId>twl</artifactId> 
     <version>1.0.0</version> 
     <scope>system</scope> 
     <systemPath>${project.basedir}/lib/TWL.jar</systemPath> 
    </dependency> 

然後我執行mvn assembly:assembly。所有的本地文件和遠程maven庫被添加,但沒有這個jar。

UPDATE

當我試圖通過java -jar myjar.jar運行的應用程序。它返回一個錯誤,即沒有上述依賴項的類(NoClassDefFoundError:de.matthiasmann.twl.ForExample)。 我想從這個jar中添加類到myjar.jar(maven與遠程依賴關係相同)。我如何配置maven來做到這一點?

+0

請詳細 –

+0

看從@BlessedGeek的答案,也對這個相關的SO問題的博客:http://stackoverflow.com/questions/2229757/maven-add-a-dependency-to-jar -by-relative-path/2230464#2230464 – maba

+0

請參閱https://stackoverflow.com/a/45120371/1709793 – craftsmannadeem

回答

7

除非您的Java EE服務器/容器配置了該jar,否則不能使用systemPath。

請記住,maven只是開發和編譯時間。一旦構建了war文件,除了將所有需要的jar文件放入WEB-INF/lib文件夾之外,maven沒有任何作用。

當您指定系統範圍時,這意味着您有責任在部署戰爭時確保該jar存在。你已經有了一個框架來做到這一點,你不希望用這個jar來阻礙你的構建依賴,但是你只能在開發過程中使它可用於Maven。

其他類似的範圍是「提供」。例如JBoss或您的企業常見部署Tomcat框架已經提供了很多像Spring和Hibernate這樣的jar,它們是由服務器啓動加載的,並且是服務器中所有應用程序共有的。因此,你不希望Maven構建將其包含到war文件中。

正確的方式,Maven大師會告訴你。就是擁有你自己的Maven服務器,並在你的服務器上構建你需要的任何工件。然而,偶爾這是不可能的。

因此,在這種情況下,我創建了與項目一起分發並簽入版本控制的項目級存儲庫。我運行命令mvn install來創建一個名爲「project-repo」的項目級目錄。

http://maven.apache.org/plugins/maven-install-plugin/examples/specific-local-repo.html(由於熟悉,大多數時候,我手動構建回購站而不是運行mvn install)。

然後在POM中,我指定file:// $ {project.basedir}/project-repo作爲其中一個存儲庫。需要注意的是,在Windows中,「file://」之後的斜槓不是在引用Windows文件系統路徑時必須反斜槓。

<repositories> 
    <repository> 
     <id>my-repo1</id> 
     <name>my custom repo</name> 
     <url>http://ho.ho.ho</url> 
    </repository> 
    <repository> 
     <id>project-repo</id> 
     <name>my project repo</name> 
     <url>file://${project.basedir}\project-repo</url> 
    </repository> 
    </repositories> 
+1

使用正斜槓沒有問題' /'在windows上的文件url中。這很好。 +1順便說一句。 – maba

0

如果你有這樣的相關性最好的解決辦法是先用一個repository manager和簡單地把這種依賴到倉庫管理員,後來用它作爲簡單的依賴。