Maven говорит, что у меня есть циклическая ссылка в многомодульном проекте, но не могу понять, почему
У меня есть многомодульный проект, который выглядит так:
- module1
- pom.xml
- module2
- pom.xml
- pom.xml
Файл pom.xml в module2 зависит от module1.
Когда я запускаю mvn clean compile, я получаю следующую ошибку:
Проекты в реакторе содержат циклическую ссылку.
Вот мои зависимости в module1:
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.48</version>
</dependency>
</dependencies>
Я не могу понять, почему он говорит, что есть циклическая ссылка. Даже когда я делаю mvn dependency: tree на module1, я получаю следующее:
[INFO] +- log4j:log4j:jar:1.2.14:compile
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.6.1:compile
[INFO] | \- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] +- com.jcraft:jsch:jar:0.1.48:compile
[INFO] \- junit:junit:jar:4.8.2:test
Мне кажется, что нет никаких ссылок на module2 в module1. Так откуда же появляется циклическая ссылка?
Изменить: Вот журнал с отладкой на:
+ Error stacktraces are turned on.
Apache Maven 2.2.1 (r801777; 2009-08-06 15:16:01-0400)
Java version: 1.6.0_31
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7" version: "6.1" arch: "amd64" Family: "windows"
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] The projects in the reactor contain a cyclic reference: Edge between 'Vertex{label='com.myorg:module2'}' and 'Vertex{label='com.myorg:module1'}' introduces to cycle in the graph com.myorg:module1 --> com.myorg:module2 --> com.myorg:module1
[INFO] ------------------------------------------------------------------------
[DEBUG] Trace
org.apache.maven.BuildFailureException: The projects in the reactor contain a cyclic reference: Edge between 'Vertex{label='com.myorg:module2'}' and 'Vertex{label='com.myorg:module1'}' introduces to cycle in the graph com.myorg:module1 --> com.myorg:module2 --> com.myorg:module1
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:295)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: hidden.org.codehaus.plexus.util.dag.CycleDetectedException: Edge between 'Vertex{label='com.myorg:module2'}' and 'Vertex{label='com.myorg:module1'}' introduces to cycle in the graph com.myorg:module1 --> com.myorg:module2 --> com.myorg:module1
at hidden.org.codehaus.plexus.util.dag.DAG.addEdge(DAG.java:143)
at hidden.org.codehaus.plexus.util.dag.DAG.addEdge(DAG.java:123)
at org.apache.maven.project.ProjectSorter.<init>(ProjectSorter.java:118)
at org.apache.maven.execution.ReactorManager.<init>(ReactorManager.java:99)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:288)
... 11 more
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Thu Jul 05 17:21:21 EDT 2012
[INFO] Final Memory: 3M/244M
[INFO] ------------------------------------------------------------------------
4 ответа
Ах! Это была вводящая в заблуждение ошибка.
Проблема была не в том, что там и module1, и module2 зависели друг от друга. Проблема заключалась в том, что module2 - это плагин Maven, и в моем корне pom.xml у меня был плагин в разделе. Я удалил этот плагин из сборки, и он начал работать.
Это случилось со мной в этих обстоятельствах.
Module_child_X был указан 2 раза в файле module_root pom.xml:
- как модуль
(pom.xml of the root module) <dependency> <groupId>module_root</groupId> <artifactId>module_child_X</artifactId> <version>0.0.1-SNAPSHOT</version> <type>jar</type> </dependency>
- как зависимость
(pom.xml of the root module) <modules> <module>module_child_X</module> ... </modules>
Решение?
Удален module_child_X как зависимость. Это уже указано как модуль.
Я делаю почти то же самое, и я использую IDEA.
У меня есть проект A, который зависит от модуля B. В pom-файле A B был объявлен как зависимость. Хорошо. В файле pom B, A был объявлен как его родитель. Я удалил эту информацию, и, как это было запрошено в сообщении об ошибке, я добавил номер версии B в файл pom.
И теперь все в порядке.
У меня была точно такая же проблема в многомодульном ушном проекте. Ejb pom зависел от веб-модуля (область компиляции), а web-компонент - от ejb-модуля. Как только я убрал зависимость pom ejb от веб-модуля, проект был собран нормально. Имеет смысл, что внутримодульные зависимости должны быть однонаправленными, чтобы избежать циклических ссылок.