6

我想将我的持续集成工作(Hudson)分成两个步骤。(因为同时构建和报告的运行时间太长了。)在第一份工作中,我成功地使用“mvn package”构建了我的多模块 maven 项目。然后我将我的工作区复制到另一个位置并尝试仅使用目标“站点”和/或 findbugs/checkstyle/pmd 再次构建项目以创建报告。但这不起作用!Maven无法解决我的子模块的依赖关系。(但所有 JAR 都在其目标文件夹中可用。)

示例:我的结构如下所示:

  • 家长
    • 一个
    • C
    • D

项目 C 作为依赖项目 B。

当我使用“mvn site”构建所有内容时,它会为项目 A 和 B 生成所有报告。但在项目 C 处停止并显示错误消息“无法解决项目 B 的依赖关系”。但是项目 B 已经用“mvn package”构建了。即我可以在其目标文件夹中找到项目B 的JAR 文件。

有没有办法在没有“mvn install”的情况下解决子模块 B 的依赖关系?(我不想在我的 ci 服务器上执行此操作。我担心这对于具有相同代码库的其他工作可能很危险。)

2012 年 8 月 20 日更新:

根文件夹的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>
    <name>Foo</name>
    <groupId>foo</groupId>
    <artifactId>bar</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>parent</module>
    </modules>
</project>

父 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>
    <name>Foo</name>
    <groupId>foo</groupId>
    <artifactId>parent</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>../bar-a</module>
        <module>../bar-b</module>
        <module>../bar-c</module>
        <module>../bar-d</module>
    </modules>
    [...]
    <reporting>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>findbugs-maven-plugin</artifactId>
                <version>2.5.1</version>
                [...]
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>2.7.1</version>
                [...]
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>2.9.1</version>            
                [...]
            </plugin>
        </plugins>
    </reporting>
</project>

B的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>foo</groupId>
        <artifactId>parent</artifactId>
        <version>1.0</version>
        <relativePath>../parent</relativePath>
    </parent>
    <name>Bar B</name>
    <artifactId>bar-b</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>  
    [...]
</project>

C的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>foo</groupId>
        <artifactId>parent</artifactId>
        <version>1.0</version>
        <relativePath>../parent</relativePath>
    </parent>
    <name>Bar C</name>
    <artifactId>bar-c</artifactId>
    <packaging>jar</packaging>
    [...]
    <dependencies>
        <dependency>
            <groupId>foo</groupId>
            <artifactId>bar-b</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
    [...]
</project>
4

1 回答 1

1

我面临着完全相同的“长时间”问题。

正如你所建议的那样,用你的工作方式解决它的唯一方法(我认为)确实是 mvn install。

但问题确实是您尝试在复制工作区时具有不同行为的方式。相反,您应该考虑 CI 将根据您的需要(每次提交或每小时)频繁地构建和测试,但只报告一次(例如每个午夜)。您将能够拥有更快的连续构建,并在夜间更正文档和报告。

这就是我们的工作方式,已经足够了。我们为此使用 jenkins,但我认为您可以使用每个 CI 软件触发它)!

@hourly : mvn clean package (or install) --> from 1 to 5 minutes to run all test on all modules
@daily : mvn clean install site -->  from 15 to 35 minutes to run all test on all modules + doc + reports + PDF reports

您还可以使用配置文件来触发不同的行为,但这对于这样的基本用途来说太复杂了。

于 2012-08-18T17:17:06.180 回答