1

我正在使用maven-dependency-plugin:build-classpath构建类路径文件。为了支持遗留部署,除了通常的依赖 JAR 集之外,我还需要这个文件来包含我正在构建的工件。

当前类路径文件:

dep1.jar:dep2.jar

我想要的类路径文件:

project-I'm-building.jar:dep1.jar:dep2.jar

我正在考虑使用 maven-antrun-plugin 生成一个包含工件 JAR 的类路径的文件,然后使用 build-classpath 选项添加依赖项 JAR。但这似乎并不优雅。有没有更好的办法?

4

1 回答 1

1

这对我有用:

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <executions>
        <execution>
            <id>build-classpath-files-for-artifact-and-direct-aspect-dependencies</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <properties>
                    <outputPath>${path.classpath}</outputPath>
                    <prefix>${prefix.classpath}</prefix>
                </properties>
                <source><![CDATA[
// Function for keying artifacts (groupId:artifactId)
def artId(art) {"${art.groupId}:${art.artifactId}".toString()}                                

if (project.packaging != "tgz") {
    log.info "Skipping generation of classpath file(s) as this isn't a tgz project"
} else {
    new File(project.properties.outputPath).mkdirs()

    // Map artifact keys to versions (as resolved by this -dist project)
    def artVers = project.runtimeArtifacts.collectEntries{[(artId(it)): it.version]}

    // Get global Maven ProjectBuilder, used for resolving artifacts to projects
    def builder = session.lookup('org.apache.maven.project.ProjectBuilder');

    // Build the classpath files, including both the dependencies plus the project artifact itself
    (project.dependencyArtifacts.findAll{dep -> dep.type == 'jar' && dep.groupId == project.groupId} + project.artifact).each{art -> 
        def req = session.projectBuildingRequest.setResolveDependencies(true)
        def depProj = builder.build(art, req).getProject();

        // Only include artifacts of type jar, and for which a resolved version exists (this excludes -dist artifacts) 
        def classpath = ([art] + depProj.runtimeArtifacts).findAll{a -> a.type == 'jar' && artVers[artId(a)] != null}.collect{
            "${project.properties.prefix}/${it.artifactId}-${artVers[artId(it)]}.jar" 
        }                                   
        def file = new File(project.properties.outputPath, art.artifactId + ".classpath")
        log.info "Writing classpath with ${classpath.size} artifact(s) to " + file
        file.write(classpath.join(":"))
    }
}                                                                
                    ]]></source>
            </configuration>
        </execution>
    </executions>
</plugin>
于 2012-12-12T15:20:24.123 回答