2013-12-11 47 views
0

不正確POM依賴我有一個搖籃項目,做了幾件事情正交:搖籃Maven插件生成自定義配置

  1. 編譯並運行一些Java。
  2. 生成併發布工件。

這個工件與Java無關;它是由定製的JavaExec任務生成的。但是,自動生成的POM(來自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 { ... } 
    } 
} 

我調用搖籃這樣的:

./gradlew uploadFoo 

AFAICS,該foo配置無關的Java配置。所以我期望公佈的POM列出沒有依賴關係。但是,我觀察所有無關列出的依賴關係。

對於Maven插件hint at dependency mapping with conf2ScopeMappings的Gradle文檔,但我完全不清楚我應該怎麼做(如果有的話)。


注:我使用搖籃包裝器1.6;我會嘗試最新,看看是否有差別?

+0

問題可能與應用'java'插件。有可能有解決方案,但我不能告訴它是什麼。新的'maven-publish'插件提供了更多的控制(但仍在孵化)。你可能想先嚐試一下。 –

+0

@PeterNiederwieser:謝謝你的提示,我會試圖找出新的插件,並讓你知道它是否修復了一些事情。 (僅供參考,如果我使用'groovy'插件而不是'java'插件,則也會出現上述問題。) –

+0

應用'groovy'也適用'java'。 –

回答

4

我設法建立類似的配置既mavenmaven-publish gradle這個插件。

在我來說,我使用自定義的jar任務自定義配置,但它應該工作,因爲artifacts { ... }在這兩種情況下使用。

隨着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' 
      ... 
     } 
    } 
} 

該解決方案是由以下螺紋的啓發:
http://gradle.1045684.n5.nabble.com/pom-generation-and-inherited-dependencies-td1436197.html

注行:

addMapping(300, configurations.foo, 'runtime') 

您可以添加其他配置,或使用其他maven範圍'運行時'範圍。
300代表優先級,在這種情況下不重要。

利用這個解決方案是,我們有超過依賴性及其映射相當精細的控制。缺點是這對install任務不起作用。我們需要爲安裝任務設置不同的poms,這可能是可能的,但這超出了我的理解。

替代與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 tasks會給你可以發佈命令:

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替代的advantege是,它會爲本地和遠程Maven倉庫工作。缺點可能是我們正在使用未來可能會更改的內部API,並且所有依賴關係都映射到「運行時」maven範圍。另外MavenPublication片段會更加冗長,如果我們想使用其他的Maven作用域或者應用一些作用域映射,將會使用更多的內部API。

我使用的搖籃1.10