【问题标题】:How to change artifactory runtime scope to compile scope?如何将工件运行时范围更改为编译范围?
【发布时间】:2015-09-13 04:48:24
【问题描述】:

我正在开发一个使用 gradle 和 jfrog 插件发布到工件的项目。重要的代码片段如下:

plugins {
   id "java"
   id "idea"
   id "groovy"
   id "pmd"
   id "findbugs"
   id "maven-publish"
   id "com.jfrog.artifactory" version "3.1.1"
}

dependencies {
   compile 'com.google.guava:guava:18.0'
   compile 'com.mashape.unirest:unirest-java:1.4.5'
   compile 'log4j:log4j:1.2.14'
}

artifactory {
   contextUrl = "https://SOME_SERVER/artifactory"
   publish {
      repository {
           repoKey = 'libs-snapshot-local'
           username = artifactory_username
           password = artifactory_password
           maven = true
      }
      defaults {
           publications ('mavenJava')
      }
   }
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}

当我做一个 gradle artifactoryPublish 时,一切似乎都运行良好。工件被发布并生成一个 pom 文件。

遗憾的是 pom 文件中的依赖都有一个 runtime 范围:

<?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>com.whatsoever</groupId>
  <artifactId>some-app</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>18.0</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>com.mashape.unirest</groupId>
      <artifactId>unirest-java</artifactId>
      <version>1.4.5</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.14</version>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
</project>

它们应该有一个编译范围,而不是这个运行时范围。我究竟做错了什么?

【问题讨论】:

    标签: gradle artifactory


    【解决方案1】:

    在 praactive 上从未尝试过,但您可以尝试使用 publication.pom.withXml 配置块在生成的 pom 中引入更改:

    publishing {
        publications {
            mavenJava(MavenPublication) {
                from components.java
    
                pom.withXml {
                    asNode().dependencies.'*'.findAll() {
                        it.scope.text() == 'runtime' && project.configurations.compile.allDependencies.find { dep ->
                            dep.name == it.artifactId.text()
                        }
                    }.each() {
                        it.scope*.value = 'compile'
                    }
                }
            }
        }
    }
    

    另外,这是新发布插件的一个已知限制,我在this thread 找到了解决方案。

    【讨论】:

    • 成功了!尽管如此,我还是决定采用传统方法,直到这个插件不再孵化。
    • 仅供参考:如果您的 Gradle 项目有多个模块,其中一个依赖于另一个。您可能需要删除行“{ dep -> dep.name == it.artifactId.text() }” 因为这实际上会更改生成的 pom.xml 中的 artifactId 标记
    猜你喜欢
    • 2010-11-06
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多