Maven多模块项目,不解决依赖关系

时间:2013-06-18 18:19:14

标签: maven teamcity

我有一个多模块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)]的依赖项

我在尝试调试时非常亏本...有没有人有任何建议?

3 个答案:

答案 0 :(得分:7)

有几种方法/工具可以解决此类问题。

  1. 对于“无法解决依赖关系”错误,在构建日志中几乎总是有更详细的错误消息和/或堆栈跟踪。 Maven日志实际上非常冗长,以至于必须在构建失败的几个屏幕上搜索“root”错误消息。

  2. 使用-X标志重新运行构建。这是documentation of Maven command line switches

  3. 另一种选择是使用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等。