2015-10-22 59 views
6

我有一個名爲的項目父。它的類型是POM。有一個庫(ojdbc6.jar)不可用在公共倉庫,所以我通過<SystemPath>訪問它,你可以看到在下面pom.xml無法訪問子模塊中的父項目庫(jar) - Maven

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.Parent</groupId> 
    <artifactId>Parent</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
     <module>childModule</module> 
    </modules> 

    <dependencies> 
     <dependency> 
      <groupId>com.oracle</groupId> 
      <artifactId>ojdbc</artifactId> 
      <version>6</version> 
      <scope>system</scope> 
      <systemPath>${basedir}/lib/ojdbc6.jar</systemPath> 
     </dependency> 
    </dependencies> 

    <repositories> 
     <repository> 
      <id>in-project</id> 
      <name>In Project Repo</name> 
      <url>file://${basedir}/lib</url> 
     </repository> 
    </repositories> 

現在孩子的項目名稱是兒童模塊1兒童單詞數使用這種(ojdbc6.jar)庫這是POM被提到如下:

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <artifactId>testApp</artifactId> 
    <version>1.14.5.1-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <name>APP1</name> 
    <description>Application</description> 

    <parent> 
     <groupId>com.Parent</groupId> 
     <artifactId>Parent</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </parent> 
</project> 

當我使用Maven構建時,它給了我錯誤:

Description Resource Path Location Type 
The container 'Maven Dependencies' references non existing library 
'C:\Users\ABCCOMPUTER_NAME\.m2\repository\com\oracle\ojdbc\6\ojdbc-6.jar' 
testApp Build path Problem. 

它爲什麼看起來在本地存儲庫中?只有當父項目包含一個包含系統路徑的庫(jar)時纔會發生。當在同一個項目中訪問系統路徑庫(jar)時,不會發生這種情況,就像父項ojdbc6.jar一樣,那裏沒有問題。

+0

罐子相對於孩子的位置在哪裏? basedir屬性在父項和子項中是不同的值。 –

+0

Jar位於相對於父項目的lib文件夾中,maven將依賴項jar傳遞到它的module.I假設maven在將依賴項jar包含到子模塊時相對於絕對路徑進行轉換。 –

回答

4

我通過更新父pom.xml的Systempath下解決了這個問題,如下圖所示:

<systemPath>${main.basedir}/lib/ojdbc6.jar</systemPath> 

,然後加在父母的main.basedir財產pom.xml和版本庫

<properties> 
     <main.basedir>${project.basedir}</main.basedir> 
    </properties> 
<repositories> 
     <repository> 
      <id>in-project</id> 
      <name>In Project Repo</name> 
      <url>file://${main.basedir}/lib</url> 
     </repository> 
</repositories> 

然後在子模塊中添加以下屬性和存儲庫元素(添加「/ ..」作爲子模塊文件夾駐留在父文件夾中,所以上一個目錄然後休息根據預期生成父庫文件夾的絕對路徑):

<properties> 
     <main.basedir>${project.basedir}/..</main.basedir> 
    </properties> 
<repositories> 
      <repository> 
       <id>in-project</id> 
       <name>In Project Repo</name> 
       <url>file://${main.basedir}/lib</url> 
      </repository> 
    </repositories> 
+0

[This answer](http://stackoverflow.com/questions/1012402/maven2-property-that-indicates-the -parent-directory)幫助我找出問題,但其答案並未解決我的問題,所以我做了一些研發並提出了上述解決方案。 –

0

來源:https://stackoverflow.com/a/2230464/1490322

Finally, declare it like any other dependency (but without the system scope):

<dependency> 
    <groupId>your.group.id</groupId> 
    <artifactId>3rdparty</artifactId> 
    <version>X.Y.Z</version> 
</dependency> 
+0

你提到的答案有一個缺點,我想知道爲什麼人們欣賞它。當你將項目提交給任何SVN倉庫,以便其他開發人員可以獲取和訪問該項目等等,他們需要運行命令svn install bla bla .. (爲了在那裏提交本地回購),並且如果有很多非全局回購jar,那麼這是耗時的任務。 –

+0

這不適用於多模塊構建,並且OP的問題已經暗示了對此策略的一些理解 –