Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle Maven插件为自定义配置生成不正确的POM依赖项_Maven_Gradle - Fatal编程技术网

Gradle Maven插件为自定义配置生成不正确的POM依赖项

Gradle Maven插件为自定义配置生成不正确的POM依赖项,maven,gradle,Maven,Gradle,我有一个Gradle项目,它做了两件正交的事情: 编译并运行一些Java 生成并发布工件 这个工件与Java无关;它由一个自定义JavaExec任务生成。然而,自动生成的POM(来自Maven插件)似乎包含了错误的依赖项问题:我如何防止这种情况发生? 我的build.gradle看起来像这样: ./gradlew uploadFoo apply插件:“java” 应用插件:“maven” 配置{ foo//我要构建和发布的工件的自定义配置 } //Java配置的依赖关系(与foo无关) 依赖关

我有一个Gradle项目,它做了两件正交的事情:

  • 编译并运行一些Java
  • 生成并发布工件
  • 这个工件与Java无关;它由一个自定义JavaExec任务生成。然而,自动生成的POM(来自Maven插件)似乎包含了错误的依赖项问题:我如何防止这种情况发生?

    我的build.gradle看起来像这样:

    ./gradlew uploadFoo
    
    apply插件:“java”
    应用插件:“maven”
    配置{
    foo//我要构建和发布的工件的自定义配置
    }
    //Java配置的依赖关系(与foo无关)
    依赖关系{
    编译“foo:foo:1.1”
    testCompile“bar:bar:2.2”
    }
    //自定义任务
    任务生成器fo(类型:JavaExec){
    ext.outputFile=新文件(buildDir,“foo.bar”)
    ...
    }
    人工制品{
    foo文件:generateFoo.outputFile,buildby:generateFoo
    }
    上传{
    存储库{
    mavenDeployer{…}
    }
    }
    
    我这样调用Gradle:

    ./gradlew uploadFoo
    
    AFAICS中,
    foo
    配置与Java配置无关。因此,我希望发布的POM不会列出任何依赖项。但是,我观察列出的所有不相关的依赖项

    Gradle为Maven插件编写了文档,但我完全不清楚我应该用它做什么(如果有的话)


    注意:我使用的是Gradle包装器1.6;我将尝试最新的,看看这是否有区别。。。

    我设法用
    maven
    maven publish
    gradle插件设置了类似的配置

    在我的例子中,我使用自定义配置的自定义Jar任务,但它应该可以工作,因为
    工件{…}
    在这两种情况下都使用

    使用
    maven
    插件,您的
    build.gradle
    看起来像:

    apply plugin: "java"
    apply plugin: "maven"
    
    configurations {
        foo  // Custom configuration for the artifact I want to build and publish
    }
    
    // Dependencies for Java configurations (nothing to do with foo)
    dependencies {
        compile "foo:foo:1.1"
        testCompile "bar:bar:2.2"
    }
    
    // Custom task
    task generateFoo(type: JavaExec) {
        ext.outputFile = new File(buildDir, "foo.bar")
        ...
    }
    
    artifacts {
        foo    file: generateFoo.outputFile, builtBy: generateFoo
    }
    
    uploadFoo {
        repositories {
            mavenDeployer { 
                pom.scopeMappings.with {
                    mappings.clear()
                    addMapping(300, configurations.foo, 'runtime')
                }
                pom.artifactId = 'other artifact id than main jar'
                ... 
            }
        }
    }
    
    此解决方案的灵感来自以下线索:

    请注意这一行:

    addMapping(300, configurations.foo, 'runtime')
    
    您还可以添加其他配置,或者使用“运行时”范围以外的其他maven范围。
    300代表优先权,在本例中并不重要

    此解决方案的优点是,我们可以很好地控制依赖项及其映射。缺点是这不适用于
    安装
    任务。我们需要为安装任务设置不同的POM,这可能是可能的,但这超出了我的知识范围

    使用
    maven publish
    插件的替代方法:

    apply plugin: "java"
    apply plugin: "maven-publish"
    
    configurations {
        foo  // Custom configuration for the artifact I want to build and publish
    }
    
    // Dependencies for Java configurations (nothing to do with foo)
    dependencies {
        compile "foo:foo:1.1"
        testCompile "bar:bar:2.2"
    }
    
    // Custom task
    task generateFoo(type: JavaExec) {
        ext.outputFile = new File(buildDir, "foo.bar")
        ...
    }
    
    artifacts {
        foo    file: generateFoo.outputFile, builtBy: generateFoo
    }
    
    publishing {
        publications {
            foo(MavenPublication) {
                from new org.gradle.api.internal.java.JavaLibrary(\
                    configurations.api.artifacts.toArray()[0], \
                    configurations.api.allDependencies)
                artifactId 'other artifact id than main jar'
            }
        }
        repositories {
            maven { ... }
        }
    }
    
    gradle任务
    将为您提供可能的发布命令:

    publish - Publishes all publications produced by this project.
    publishFooPublicationToMavenLocal - Publishes Maven publication 'foo' to the local Maven repository.
    publishFooPublicationToMavenRepository - Publishes Maven publication 'foo' to Maven repository 'maven'.
    publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache.
    ...
    
    maven publish
    alternative的优点是,它将适用于本地和远程maven存储库。缺点可能是我们使用的内部API将来可能会更改,并且所有依赖项都映射到“runtime”maven范围。此外,如果我们想使用其他一些maven范围或应用一些范围映射,MavenPublication片段将更加详细,并且将使用更多的内部API


    我使用的是Gradle 1.10

    我设法用
    maven
    maven publish
    Gradle插件设置了类似的配置

    在我的例子中,我使用自定义配置的自定义Jar任务,但它应该可以工作,因为
    工件{…}
    在这两种情况下都使用

    使用
    maven
    插件,您的
    build.gradle
    看起来像:

    apply plugin: "java"
    apply plugin: "maven"
    
    configurations {
        foo  // Custom configuration for the artifact I want to build and publish
    }
    
    // Dependencies for Java configurations (nothing to do with foo)
    dependencies {
        compile "foo:foo:1.1"
        testCompile "bar:bar:2.2"
    }
    
    // Custom task
    task generateFoo(type: JavaExec) {
        ext.outputFile = new File(buildDir, "foo.bar")
        ...
    }
    
    artifacts {
        foo    file: generateFoo.outputFile, builtBy: generateFoo
    }
    
    uploadFoo {
        repositories {
            mavenDeployer { 
                pom.scopeMappings.with {
                    mappings.clear()
                    addMapping(300, configurations.foo, 'runtime')
                }
                pom.artifactId = 'other artifact id than main jar'
                ... 
            }
        }
    }
    
    此解决方案的灵感来自以下线索:

    请注意这一行:

    addMapping(300, configurations.foo, 'runtime')
    
    您还可以添加其他配置,或者使用“运行时”范围以外的其他maven范围。
    300代表优先权,在本例中并不重要

    此解决方案的优点是,我们可以很好地控制依赖项及其映射。缺点是这不适用于
    安装
    任务。我们需要为安装任务设置不同的POM,这可能是可能的,但这超出了我的知识范围

    使用
    maven publish
    插件的替代方法:

    apply plugin: "java"
    apply plugin: "maven-publish"
    
    configurations {
        foo  // Custom configuration for the artifact I want to build and publish
    }
    
    // Dependencies for Java configurations (nothing to do with foo)
    dependencies {
        compile "foo:foo:1.1"
        testCompile "bar:bar:2.2"
    }
    
    // Custom task
    task generateFoo(type: JavaExec) {
        ext.outputFile = new File(buildDir, "foo.bar")
        ...
    }
    
    artifacts {
        foo    file: generateFoo.outputFile, builtBy: generateFoo
    }
    
    publishing {
        publications {
            foo(MavenPublication) {
                from new org.gradle.api.internal.java.JavaLibrary(\
                    configurations.api.artifacts.toArray()[0], \
                    configurations.api.allDependencies)
                artifactId 'other artifact id than main jar'
            }
        }
        repositories {
            maven { ... }
        }
    }
    
    gradle任务
    将为您提供可能的发布命令:

    publish - Publishes all publications produced by this project.
    publishFooPublicationToMavenLocal - Publishes Maven publication 'foo' to the local Maven repository.
    publishFooPublicationToMavenRepository - Publishes Maven publication 'foo' to Maven repository 'maven'.
    publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache.
    ...
    
    maven publish
    alternative的优点是,它将适用于本地和远程maven存储库。缺点可能是我们使用的内部API将来可能会更改,并且所有依赖项都映射到“runtime”maven范围。此外,如果我们想使用其他一些maven范围或应用一些范围映射,MavenPublication片段将更加详细,并且将使用更多的内部API


    我使用的是Gradle 1.10

    问题可能与应用
    java
    插件有关。可能有一个解决办法,但我不能马上说是什么。新的
    maven publish
    插件提供了更多的控制(但仍在酝酿中)。你可能想先试试。@PeterNiederwieser:谢谢你的提示,我会尝试找出新的插件,让你知道它是否能解决问题。(仅供参考,如果我使用
    groovy
    插件而不是
    java
    插件,上述问题也会发生。)应用
    groovy
    也适用
    java
    。问题可能与应用
    java
    插件有关。可能有一个解决办法,但我不能马上说是什么。新的
    maven publish
    插件提供了更多的控制(但仍在酝酿中)。你可能想先试试。@PeterNiederwieser:谢谢你的提示,我会尝试找出新的插件,让你知道它是否能解决问题。(仅供参考,如果我使用
    groovy
    插件而不是
    java
    插件,上述问题也会发生。)应用
    groovy
    也适用
    java