如何让 gradle 在项目的根目录为 maven 用户生成一个有效的 pom.xml 文件?

Posted

技术标签:

【中文标题】如何让 gradle 在项目的根目录为 maven 用户生成一个有效的 pom.xml 文件?【英文标题】:How to make gradle generate a valid pom.xml file at the root of a project for maven users? 【发布时间】:2013-06-21 08:10:36 【问题描述】:

虽然现在只有两天,但我肯定对在我所有的 Java 项目中使用 gradle 感到满意,并从我所有项目的根目录中删除 pom.xml。

但是,我希望保持与 maven 兼容,因为我希望 gradle 任务能够在用户需要时在项目的根目录中生成合适的 pom.xml。

此时,我唯一对 pom.xml 的引用是在 build.gradle 文件的这一部分中(这是,经过很少的修改,找到了 here):

uploadArchives 
    repositories 
        mavenDeployer 
            beforeDeployment 
                MavenDeployment deployment -> signing.signPom(deployment);
            

            repository(url: sonatypeRepoURI) 
                authentication(userName: sonatypeUsername,
                    password: sonatypePassword);
            

            pom.project 
                name "$name";
                packaging "bundle";
                description "$description";
                url "$projectURL";

                scm 
                    url "$gitroscm";
                    connection "$gitroscm";
                    developerConnection "$gitrwscm";
                

                licenses 
                    license 
                        name "Lesser General Public License, version 3 or greater";
                        url "http://www.gnu.org/licenses/lgpl.html";
                        distribution "repo";
                    
                

                developers 
                    developer 
                        id "whocares";
                        name "whocares";
                        email "whocares";
                    
                
            
        
    

我如何将pom.project 从这个嵌套非常深的构造中提取到一个可以生成 pom.xml 的任务中(默认情况下,生成的 pom.xml 在build/poms/pom-default.xml 中并且看起来不错)?

更重要的是,是否可以从uploadArchives 中提取pom.project,同时仍然可以引用它?

build.gradle 文件的完整链接:here。

【问题讨论】:

你有没有看gradle.org/docs/current/userguide/maven_plugin.html#N1511A,我没用过,但是看起来和你描述的一样。 @KirilRaychev 这看起来很有趣,但是将它集成到现有的执行流程中是我不知所措的地方:/ 如果你想手动构建 pom,只需运行writeNewPom 任务。如果您想在每次构建时生成一个 pom,请将 build.dependsOn writeNewPom 添加到您的 build.grade 呃,我已经加载了 maven 插件...而 gradle writeNewPom 却说找不到任务! 工作对我来说很好 - 看看这个例子build.gradle - gist.github.com/jmruc/5852692 【参考方案1】:

您可以使用gradle maven plugin。这会将pom 约定方法添加到您的项目中,您可以在任务中使用它来生成pom.xml 文件,例如

task writeNewPom 
    doLast 
        pom 
            project 
                groupId 'org.example'
                artifactId 'test'
                version '1.0.0'
                inceptionYear '2008'
                licenses 
                    license 
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        distribution 'repo'
                    
                
            
        .writeTo("pom.xml")
    

然后调用gradle createPom在项目根目录生成pom.xml。在 pom 定义中的所有内容中,您确实应该提供 groupIdartifactIdversion,其他诸如 licenses 之类的内容并不那么重要。

您还可以查看 this example 以获取具有一些依赖项的项目定义,并尝试运行它以查看它产生的结果。

添加了一些新关键字,弃用了一些技术。 Please check

【讨论】:

我得到了没有依赖关系的 pom 文件:( 如何获得对 pom.xml 的依赖? 如何添加属性部分? 这样做有一个问题:即使内容已经正确,它也会覆盖 pom.xml。这使得所有后续构建阶段即使在不需要时也会运行,因为它会更改文件时间戳。 (我也不知道更好的选择) << 已被弃用并最终在 Gradle 版本 5.x 中被删除,因此在 sn-p 之上会引发最新版本的 Gradle 异常。您需要改用Task.doLast(),另请参阅could-not-find-method-leftshift-for-arguments...【参考方案2】:

这是我的 build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'maven'

repositories  
mavenLocal() 
mavenCentral()


dependencies 

    compile 'org.springframework:spring-core:4.0.5.RELEASE'
    compile 'org.springframework:spring-webmvc:4.0.5.RELEASE'

    compile 'org.slf4j:slf4j-api:1.7.5'
    runtime 'org.slf4j:slf4j-log4j12:1.7.5'

    testCompile 'org.springframework:spring-test:4.0.5.RELEASE'

    testCompile 'junit:junit:4.11'
    testCompile "org.mockito:mockito-core:1.9.5"
    testCompile "org.hamcrest:hamcrest-library:1.3"

    testCompile 'javax.servlet:javax.servlet-api:3.0.1'

test 
  testLogging 
    // Show that tests are run in the command-line output
    events 'started', 'passed'
  

task wrapper(type: Wrapper)  gradleVersion = '1.12' 
task createPom  
    pom 
        project 
            groupId 'sg.test.spring.web.guide'
            artifactId 'sg-web-initial'
            version '1.0.0-SNAPSHOT'

            inceptionYear '2008'
            licenses 
                license 
                    name 'The Apache Software License, Version 2.0'
                    url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    distribution 'repo'
                
            
        
    .writeTo("pom.xml")

您可以随意将任务命名为createPomanyTaskName。 然后只需运行 gradle cleangrale build 或简单地运行 gradle createPom

这将在项目的根目录中将其生成为 pom.xml。虽然您可以将writeTo("pom.xml") 替换为writeTo("<anyDir>/newpom.xml")

生成的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>sg.test.spring.web.guide</groupId>
    <artifactId>sg-web-initial</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <inceptionYear>2008</inceptionYear>
    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <distribution>repo</distribution>
        </license>
    </licenses>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.0.5.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.0.5.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.9.5</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.0.5.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

【讨论】:

是否可以在 build.gradle 中添加一些行来在 pom 文件中生成 maven 插件条目? 这里的代码会急切地创建 pom.xml 文件,即使你不需要它。 (可能应该在 doLast 块内) @Trejkaz 这不只是我们调用 createPom 任务吗?在那种情况下,这不意味着我们需要它吗? doLast 什么时候会有所作为? @Drew 当前代码正在配置时写入文件,因为对 writeTo 的调用直接在任务配置块内。仅仅配置任务应该会导致文件被写入。 (在这种情况下,配置正在急切地完成,因为tasks.register也没有被使用。如果更改为tasks.register,它可能只会配置即将实际运行的任务,尽管这取决于构建脚本中还有什么。) pom.xml中没有写依赖

以上是关于如何让 gradle 在项目的根目录为 maven 用户生成一个有效的 pom.xml 文件?的主要内容,如果未能解决你的问题,请参考以下文章

将Java项目从maven迁移到gradle

maven 和 gradle 项目互转

maven项目和gradle项目互相转化

如何让我的 gradle 测试任务为不在 maven Central 上的库使用 python pip install?

sts如何添加gradle子工程

如何将 Maven 构建转换为 Gradle?