1

Stackoverflow 上已经存在关于从 Gradle 向 Maven 发布预构建 jar 的问题。但是,这略有不同:如何将预构建的 Jar 发布到 Maven 存储库,同时提供要包含在 pom.xml 文件中的依赖项?

我有一个在此脚本外部预构建的 jar。我需要将此 jar 发布到我们的 Maven 存储库 (Nexus) 并在 pom.xml 中指定依赖项。我已经能够使用工件闭包将预构建的 jar 发布到 Maven 存储库,但它忽略了依赖项闭包。如果我添加 java 插件,那么 Maven 插件会创建一个带有依赖项的 pom,但会上传一个零字节的 jar 文件。我猜这是因为 Java 插件希望在 src 目录中编译和打包源代码,而这个项目中不存在。

有没有办法可以将预构建的 Jar“注入”到 Java 插件进程中,以便可以将 jar 与依赖项一起上传?还是我错过了其他明显的东西?

当然,最好的办法是预先构建 Jar 的构建过程来概述其依赖项并上传到 Maven,但不幸的是,它是第 3 方软件,我们无法控制。

下面的脚本发布一个零 kb jar 文件...

apply plugin: 'java'
apply plugin: 'maven'
jar = file(projectHome + '/build/lib').listFiles()[0]
configurations {
    archives
    runtime
}
dependencies {
    runtime 'org.apache.tika:tika-app:1.3'
}
artifacts {
    archives jar
}
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://build.com/nexus/content/repositories/releases/")
            pom.version = tag
            pom.artifactId = "artifact"
            pom.groupId = "group"
        }
    }
} 

非常感谢!抢

4

1 回答 1

5

我们可以通过使用 java 插件和 maven-publish 插件,使用 Gradle 将预构建的 jar 发布到 Maven 存储库中。maven-publish 具有使用 pom.withXml 块将依赖项注入生成的 pom 的功能。

因此,我提供了一个示例 build.gradle 文件,该文件生成带有指定依赖项的预构建工件的 pom.xml。你可以试试这个建议,如下所示。

apply plugin: "maven-publish"
apply plugin: "java"



dependencies {
    compile "dependency:antlr:2.7.7"
    compile "dependency:commons-beanutils:1.9.3"
    compile "dependency:dom4j:1.6.1"
    compile "dependency:jettison:1.3.8"
}

publishing {

    repositories {
        maven {
            url "$mavenUrl"
            credentials {
                username = "$mavenUser"
                password = "$mavenPwd"

        }
        }
    }
    publications {
        maven(MavenPublication) {
            groupId "test"
            artifactId "myArtifact"
            version "1.0"
            artifact ("/scratch/test/jars/myArtifact.jar")
            pom.withXml {
                def dependencies  = asNode().appendNode("dependencies")
                configurations.compile.allDependencies.each {  dep ->
                    def depNode  = dependencies.appendNode("dependency")
                    depNode.appendNode("groupId", dep.group)
                    depNode.appendNode("artifactId", dep.name)
                    depNode.appendNode("version", dep.version)
                }       
            }
        }
    }
}

生成的 pom 如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>myArtifact</artifactId>
  <version>1.0</version>
  <dependencies>
    <dependency>
      <groupId>dependency</groupId>
      <artifactId>antlr</artifactId>
      <version>2.7.7</version>
    </dependency>
    <dependency>
      <groupId>dependency</groupId>
      <artifactId>commons-beanutils</artifactId>
      <version>1.9.3</version>
    </dependency>
    <dependency>
      <groupId>dependency</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>
    <dependency>
      <groupId>dependency</groupId>
      <artifactId>jettison</artifactId>
      <version>1.3.8</version>
    </dependency>
  </dependencies>
</project>

我想这可能会回答你的问题

于 2018-05-02T13:59:12.710 回答