2015-10-22 58 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的问题已经暗示了对此策略的一些理解 –