2012-07-19 48 views
0

我有两个Java项目:子项和父项与子项取决于父项。项目布局这两个项目如下:分别亲子项目Eclipse IAM和Maven解决依赖不在pom.xml中列出的问题

​​

的.class路径,列示如下:

家长:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" path="src"/> 
    <classpathentry excluding="src/" kind="src" path=""/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    <classpathentry kind="output" path="bin"/> 
</classpath> 

儿童:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" path="src"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    <classpathentry combineaccessrules="false" kind="src" path="/ParentProject"/> 
    <classpathentry kind="output" path="bin"/> 
</classpath> 

子级对父级具有依赖关系,如上面的classpathentry所示。

我用Eclipse Integration for Apache Maven plugin (IAM)将这些Java项目转换为Maven项目。相应的pom.xml文件如下:

家长:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.parentco</groupId> 
    <artifactId>ParentProject</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</project> 

儿童:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.childco</groupId> 
    <artifactId>ChildProject</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</project> 

正如你所看到的,孩子的pom.xml没有依赖于父神器。

我在两个项目上都使用“干净安装”目标运行Maven Build,从Parent开始,我看到工件被部署到我的本地存储库。太好了......但是等等...... ...孩子的pom没有列出依赖项,但是父项目但是子项目的构建成功,如输出控制台所示。

[DEBUG] (f) packaging = jar 
[DEBUG] (f) pomFile = C:\Users\nji\workspace\ChildProject\pom.xml 
[DEBUG] (f) updateReleaseInfo = false 
[DEBUG] -- end configuration -- 
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for C:\Users\nji\.m2\repository 
[INFO] Installing C:\Users\nji\workspace\ChildProject\target\ChildProject-0.0.1-SNAPSHOT.jar to C:\Users\nji\.m2\repository\org\childco\ChildProject\0.0.1-SNAPSHOT\ChildProject-0.0.1-SNAPSHOT.jar 
[INFO] Installing C:\Users\nji\workspace\ChildProject\pom.xml to C:\Users\nji\.m2\repository\org\childco\ChildProject\0.0.1-SNAPSHOT\ChildProject-0.0.1-SNAPSHOT.pom 
[DEBUG] Installing org.childco:ChildProject:0.0.1-SNAPSHOT/maven-metadata.xml to C:\Users\nji\.m2\repository\org\childco\ChildProject\0.0.1-SNAPSHOT\maven-metadata-local.xml 
[DEBUG] Installing org.childco:ChildProject/maven-metadata.xml to C:\Users\nji\.m2\repository\org\childco\ChildProject\maven-metadata-local.xml 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1.809s 
[INFO] Finished at: Thu Jul 19 17:05:08 EDT 2012 
[INFO] Final Memory: 15M/217M 
[INFO] ------------------------------------------------------------------------ 

那么,为什么Maven的拉这一关没有在pom.xml中一个明确的条目,即使它去除的.classpath的classpathentry给家长?

这是.classpaths项目被Maven化后:

家长:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> 
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/> 
    <classpathentry kind="output" path="target/classes"/> 
</classpath> 

儿童:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> 
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/> 
    <classpathentry kind="output" path="target/classes"/> 
</classpath> 

它只是静静地看着我的本地库最后的手段? 另外,如果我打开代码编辑器来编辑Child中依赖Parent的类,则会发生解析错误,如果将此依赖项添加到孩子的pom中,可能会得到解决。这不是IAM应该做的吗?

回答

0

Maven不会明确地为你写一个依赖到pom.xml。但是,一旦你在pom文件(父或子)中列出了一个依赖项,maven就应该能够拥有类路径中的所有依赖关系,从而能够部署所有的依赖关系。

Maven只构建一次类路径变量,其中它将列出所有依赖关系。因此您无需多次指定。

+0

因此,当IAM将eclipse项目转换为maven时,它不会将eclipse依赖转换为pom依赖? – greyfairer 2012-07-19 21:36:23

+0

除了@greyfairer问题此类路径信息在哪里?参考我的例子,Parent的pom没有任何依赖关系。这是预料之中的。孩子的pom没有任何依赖,但不知何故,Maven能够在不依赖信息的情况下构建jar。怎么样? – 2012-07-19 21:40:09

+0

你确定依赖关系不在pom文件中吗?在代码的任何标准路径中都没有?你的eclipse中有哪些依赖关系?那些依赖包括在那里? – gkris 2012-07-19 21:48:47