4

我有一个无法编译的多模块 Maven 项目。我的本地网络上有一个 Nexus 存储库,它正在工作(IntelliJ Idea 能够解决我仅驻留在该存储库中的依赖项),并且我正在通过 Jetbrains TeamCity 构建。我相当肯定 TeamCity 正在工作,因为我设置的其他几个构建配置仍然有效(使用相同的 settings.xml)。对于可能导致问题的原因,我有点茫然。这是我的pom文件:

父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>

产品无线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:product-wireless-plugin [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-parent- 0.9.0.pom [13:54:16][com.company.product.plugins:product-wireless-plugin] 无法在项目 product-wireless-plugin 上执行目标:无法解析项目 com.company.product 的依赖项.plugins:product-wireless-plugin:jar:0.1.2:无法收集 [com.company.product: 的依赖项:product-common:jar:0.9.1 (编译)]

我在尝试调试时不知所措……有人有什么建议吗?

4

3 回答 3

8

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

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

  2. -X使用标志重新运行构建。这是Maven 命令行开关的文档

  3. 另一种选择是用于mvn dependency:tree检查传递依赖关系的完整图。mvn help:effective-pom是另一个有用的工具,它在考虑您的 settings.xml、任何活动配置文件等之后打印出 pom.xml。同样mvn help:active-profiles

于 2013-06-19T13:37:56.880 回答
2

您的多模块构建中有很多问题。最重要的是你定义了一个依赖:

<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 等。

于 2013-06-19T05:15:26.360 回答
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 版本更改为指向存储库中的最新版本解决了我的插件构建问题。

于 2013-06-19T13:06:32.597 回答