0

我有两个 Java 项目:子项和父项,子项取决于父项。两个项目的项目布局如下图所示:

在此处输入图像描述

Parent 和 Child 项目的 .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>

Child 依赖于 parent,如上面的 classpathentry 所示。

我使用Eclipse Integration for Apache Maven 插件 (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 不依赖于 Parent 工件。

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

[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 中删除了 Parent 的类路径条目?

这是项目被 mavenized 后的 .classpaths:

家长:

    <?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 的类,我会得到解析错误,如果我将此依赖项添加到 child 的 pom.xml 中,这可能会得到修复。这不是 IAM 应该做的吗?

4

1 回答 1

0

Maven 不会为您显式地将依赖项写入 pom.xml。但是,一旦您在任一 pom 文件(父文件或子文件)中列出了依赖项,那么 maven 应该能够在类路径中拥有所有依赖项,从而能够部署所有依赖项。

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

于 2012-07-19T21:31:25.360 回答