0

親に応じて、子と子を持つ親の2つのJavaプロジェクトがあります。両方のプロジェクトのプロジェクト レイアウトを以下に示します。

ここに画像の説明を入力

親プロジェクトと子プロジェクトのそれぞれの .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>

上記のクラスパス エントリに示されているように、子は親に依存しています。

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 は親アーティファクトに依存していません。

親から始めて、両方のプロジェクトで「クリーン インストール」目標を使用して Maven ビルドを実行したところ、アーティファクトがローカル リポジトリにデプロイされていることがわかりました。素晴らしい....しかし待ってください.......出力コンソールに示されているように、子の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] ------------------------------------------------------------------------

.classpath の Parent への classpathentry を削除した後でも、pom.xml の明示的なエントリなしで、Maven はどのようにしてこれを実行したのでしょうか?

これは、プロジェクトが Maven 化された後の .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>

最後の手段として、ローカル リポジトリを静かに検索するだけですか? また、親に依存する子のクラスを編集するためにコード エディターを開くと、解決エラーが発生します。この依存関係を子の pom に追加すると、おそらく修正されるでしょう。これは IAM がすべきことではないでしょうか?

4

1 に答える 1

0

Mavenは、pom.xmlに依存関係を明示的に書き込むことはありません。ただし、pomファイル(親または子)のいずれかに依存関係がリストされると、mavenはクラスパスにすべての依存関係を持つことができるはずです。これにより、すべての依存関係をデプロイできます。

Mavenはクラスパス変数を1回だけビルドします。この場合、すべての依存関係がリストされます。したがって、複数回指定する必要はありません。

于 2012-07-19T21:31:25.360 に答える