我有一个多模块maven项目,我无法编译。我在我的本地网络上有一个Nexus存储库,它正在工作(IntelliJ Idea能够解析仅存在于该存储库中的依赖关系),我正在通过Jetbrains TeamCity构建。我相当确定TeamCity正在工作,因为我设置的其他几个构建配置仍然有效(使用相同的settings.xml)。对于可能导致问题的原因,我有点失落。这是我的pom文件:
父母:
<?xml version="1.0" encoding="UTF-8"?>
<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>com.company.product.plugins</groupId>
<artifactId>plugin-parent</artifactId>
<version>1.2-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>product-wireless-plugin</module>
<module>product-paging-plugin</module>
</modules>
<distributionManagement>
<repository>
<id>releases</id>
<url>http://192.168.2.192:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://192.168.2.192:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
<pluginRepositories>
<pluginRepository>
<id>autoincrement-versions-maven-plugin</id>
<name>autoincrement-versions-maven-plugin</name>
<url>http://autoincrement-versions-maven-plugin.googlecode.com/svn/repo</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>autoincrement-versions-maven-plugin</artifactId>
<version>2.0-SNAPSHOT</version>
<executions>
<execution>
<id>update-pom-versions</id>
<goals>
<goal>increment</goal>
<goal>commit</goal>
</goals>
<phase>compile</phase>
<configuration>
<autoIncrementVersion>true</autoIncrementVersion>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
</plugins>
</build>
</project>
product-wireless pom:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>plugin-parent</artifactId>
<groupId>com.company.product.plugins</groupId>
<version>1.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.product.plugins</groupId>
<artifactId>product-wireless-plugin</artifactId>
<version>0.1.2</version>
<distributionManagement>
<repository>
<id>releases</id>
<url>http://192.168.2.192:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://192.168.2.192:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
<dependencies>
<dependency>
<groupId>com.company.product</groupId>
<artifactId>product-common</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
</project>
产品分页pom:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>plugin-parent</artifactId>
<groupId>com.company.product.plugins</groupId>
<version>1.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.product.plugins</groupId>
<artifactId>product-paging-plugin</artifactId>
<version>0.1.2</version>
<distributionManagement>
<repository>
<id>releases</id>
<url>http://192.168.2.192:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://192.168.2.192:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
<dependencies>
<dependency>
<groupId>com.company.product</groupId>
<artifactId>product-common</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
</project>
我得到的错误是:
com.company.product.plugins:产品无线插件 [13:54:16] [com.company.product.plugins:product-wireless-plugin]从'C:/ TeamCity / buildAgent / work / 40ac813105cf8bd7 / product-wireless-plugin / target / surefire-reports / TEST导入数据 - * .xml'带'surefire'处理器 [13:54:16] [com.company.product.plugins:product-wireless-plugin] Surefire报告观察者 [13:54:16] [com.company.product.plugins:product-wireless-plugin]正在下载:repolocation / nexus / content / groups / public / com / company / product / product-parent / 0.9.0 / product-家长0.9.0.pom [13:54:16] [com.company.product.plugins:product-wireless-plugin]无法在项目产品无线插件上执行目标:无法解决项目com.company.product.plugins的依赖项:product- wireless-plugin:jar:0.1.2:无法收集[com.company.product:product-common:jar:0.9.1(compile)]的依赖项
我在尝试调试时非常亏本...有没有人有任何建议?
答案 0 :(得分:7)
有几种方法/工具可以解决此类问题。
对于“无法解决依赖关系”错误,在构建日志中几乎总是有更详细的错误消息和/或堆栈跟踪。 Maven日志实际上非常冗长,以至于必须在构建失败的几个屏幕上搜索“root”错误消息。
使用-X
标志重新运行构建。这是documentation of Maven command line switches
另一种选择是使用mvn dependency:tree
来检查传递依赖的完整图。 mvn help:effective-pom
是另一个有用的工具,可在考虑settings.xml,任何有效配置文件等后打印出pom.xml。同样mvn help:active-profiles
答案 1 :(得分:2)
好的,我已经通过@noahlz的输入解决了这个问题。在使用-X标志来调试我的构建之后,我发现无法找到“product-common”(product-parent)的父pom。在浏览了我的Sonatype Nexus存储库后,我发现我的构建系统只是在添加新模块时发布父pom的新版本。因此,即使我的父pom是0.9.0版本,存储库的最新版本为0.6.1。我认为“product-common”库正在编译正确,因为它在编译时可以访问父pom(使用0.9.0版本号)。无论哪种方式,将“product-common”中的父pom版本更改为指向存储库中的最新版本解决了我的插件的构建问题。
答案 2 :(得分:1)
您的多模块构建存在许多问题。最重要的是你定义一个依赖:
<dependencies>
<dependency>
<groupId>com.company.product</groupId>
<artifactId>product-common</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
似乎要么不存在于存储库中,要么您无法访问包含它的存储库,或者您的下载因任何原因而失败(无法猜测!)。您使用的是像Artifactory,Nexus,Archiva这样的存储库管理器吗?如果不是,我建议开始使用。
除此之外,您使用不同版本的父版本和无线模块中的模块:
<parent>
<artifactId>plugin-parent</artifactId>
<groupId>com.company.product.plugins</groupId>
<version>1.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.product.plugins</groupId>
<artifactId>product-wireless-plugin</artifactId>
<version>0.1.2</version>
多模块构建应仅通过父项定义版本,而工件中的不,这意味着上面应如下所示:
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>plugin-parent</artifactId>
<groupId>com.company.product.plugins</groupId>
<version>1.2-SNAPSHOT</version>
</parent>
<groupId>com.company.product.plugins</groupId>
<artifactId>product-wireless-plugin</artifactId>
模块本身不应定义版本,因为它将从父版本继承它。此外,您可以看到您有一个定义发行版本(1.2)的模块,而父模块定义了SNAPSHOT版本。正在开发的应用程序/模块应该定义一个SNAPSHOT版本的版本,这意味着像1.2-SNAPSHOT
等。
这同样适用于distributionManagement的定义。这应该只在项目的父项中定义一次。
顺便说一句。如果您有多个项目,最好的方法是定义一个公司父级,其中包含一些默认定义,如distributionManagement,pluginManagement,dependencyManagement等。