1. ホーム
  2. Maven

Mavenの解決方法 アーティファクト記述子の読み込みに失敗しました

2022-02-14 19:13:55

はじめに

この記事では、Maven のマルチモジュール・プロジェクトにおいて、あるモジュールが別のモジュールを参照している場合に発生する "Failed to read artifact descriptor" 問題を解決する方法についてまとめています。

複数のサブモジュールプロジェクトの作成

この2日間、Maven Authority Guideの6章を参考に、マルチモジュールのプロジェクトを作ろうとしているのですが、親モジュールのPOM構成は以下のようになっています。

<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.sonatype.mavenbook.ch06</groupId>
	<artifactId>simple-parent</artifactId>
	<packaging>pom</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>simple-parent</name>
	<url>http://maven.apache.org</url>
	
	<modules>
	   <module>simple-weather</module>
	   <module>simple-webapp</module>
	</modules>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	
	<build>
	   <pluginManagement>
	   
	       <plugins>
	           <plugin>
	               <groupId>org.apache.maven.plugins</groupId>
	               <artifactId>maven-compiler-plugin</artifactId>
	               <configuration>
	                   <source>1.8</source>
	                   <target>1.8</target>
	               </configuration>
	           </plugin>
	           
	       </plugins>
	   </pluginManagement>
	</build>
</project>


simple-weather サブモジュール用の POM 設定です。

<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>org.sonatype.mavenbook.ch06</groupId>
		<artifactId>simple-parent</artifactId>
		<version>1.0-SNAPSHOT</version>
	</parent>

	<artifactId>simple-weather</artifactId>
	<packaging>jar</packaging>
	<name>simple-weather</name>
	<url>http://maven.apache.org</url>

	<dependencies>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
		</dependency>

		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>1.6.1</version>
		</dependency>

		<dependency>
			<groupId>jaxen</groupId>
			<artifactId>jaxen</artifactId>
			<version>1.1.1</version>
		</dependency>

		<dependency>
			<groupId>velocity</groupId>
			<artifactId>velocity</artifactId>
			<version>1.5</version>
		</dependency>

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.3.2</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<finalName>simple-weather</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<! -- <skip>true</skip -->
					<testFailureIgnore>true</testFailureIgnore>
				</configuration>
			</plugin>

			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<configuration>
					<descriptorRefs>jar-with-dependencies</descriptorRefs>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

simple-webappサブモジュールです。

<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>org.sonatype.mavenbook.ch06</groupId>
		<artifactId>simple-parent</artifactId>
		<version>1.0-SNAPSHOT</version>
	</parent>

	<artifactId>simple-webapp</artifactId>
	<packaging>war</packaging>
	<name>simple-webapp Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>org.apache.geronimo.specs</groupId>
			<artifactId>geronimo-servlet_3.0_spec</artifactId>
			<version>1.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>org.sonatype.mavenbook.ch06</groupId>
			<artifactId>simple-weather</artifactId>
			<version>${project.version}</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>simple-webapp</finalName>
		<plugins>
			<plugin>
				<groupId>org.mortbay.jetty</groupId>
				<artifactId>maven-jetty-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>



コンパイル、インストール

まず、simple-weather サブモジュールプロジェクトをコンパイルし、インストールします: simple-weather サブプロジェクトディレクトリに移動します。

mvn compile
mvn install

simple-webappサブモジュールのプロジェクトディレクトリに移動して、mvn compileでコンパイルすると、以下のエラーが発生します。

[ERROR] Failed to execute goal on project simple-webapp: Could not resolve dependencies for project 
org.sonatype.mavenbook.ch06:simple-webapp:war:1.0-SNAPSHOT: Failed to collect dependencies at 
org.sonatype.mavenbook.ch06:simple-weather:jar:1.0-SNAPSHOT: Failed to read artifact descriptor for 
org.sonatype.mavenbook.ch06:simple-weather:jar:1.0-SNAPSHOT: Could not find artifact 
org.sonatype.mavenbook.ch06:simple-parent:pom:1.0-SNAPSHOT -> [Help 1]

この問題に対して、まずPOMファイルの設定を確認したところ、特に変わった情報はありませんでした。ローカルの.m2/repositoryのインストールを確認しましたが、問題ありませんでした。再度、simple-weather サブモジュールを mvn -U clean install でクリアした後にインストールしましたが、問題は解消されませんでした。結局、stackoverflowで同じような問題を見つけ、誰かが出した以下の解決策を見つけ、ようやく私の問題を解決することができました。

この問題は、親 pom を参照するいくつかの子プロジェクトがあり、親 pom ディレクトリからインストール(親ディレクトリから mvn install を実行)していない場合に発生する可能性があります。子プロジェクトの1つは兄弟プロジェクトに依存しており、兄弟プロジェクトのpomを読みに行くとき、少なくとも一度は親pomディレクトリからインストールされていない限り、質問にあるようなエラーで失敗する可能性があります。
大雑把に訳すと、この問題は、親プロジェクトの POM を参照する子プロジェクトがありながら、親 POM ディレクトリにインストール操作を行わない場合に発生します。子モジュールが兄弟の子モジュールに依存している場合、少なくとも一度は親プロジェクトの POM ディレクトリにインストールを実行する必要があります。

参考文献

1. Maven: アーティファクト記述子の読み込みに失敗しました