Gradle:将预构建的带有依赖项的jar发布到Maven仓库

4

在Stackoverflow上已经有关于如何使用Gradle将预构建的Jar发布到Maven的问题。然而,本文稍有不同:我如何将预构建的Jar发布到Maven仓库,并同时提供用于包含在pom.xml文件中的依赖项?

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

是否有一种方法可以“注入”预构建的Jar到Java插件进程中,以便我可以将该jar与依赖项一起上传?或者我还缺少其他明显的东西吗?

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

以下脚本发布一个0KB的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"
        }
    }
} 

许多感谢!Rob

你可以使用 mavenDeployer POM DSL 来添加依赖项(请参阅用户指南)。 - Peter Niederwieser
谢谢Peter。我实际上是通过创建自定义插件来使用完全不同的方法解决了这个问题。如果我不能通过POM DSL使其工作,看到答案会很有用。 - Robert Watts
1个回答

8
我们可以使用Gradle的java插件和maven-publish插件将预构建的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>

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

我喜欢这个答案,非常感谢。我正在寻找一种方法来拉取依赖项并取消签名jar文件,并重新发布它以及一组修改后的依赖项,以替换已签名引用与新的未签名引用。我知道这会带来很多麻烦,但这是我避免由于我的某些类扩展签名代码而导致安全异常的唯一方法。因此,基本上我只有一个依赖项myArtifact.jar,我想让它解决antlr、commons等依赖项,但我在递归方面遇到了困难。 - Calvin Taylor
有没有办法添加需要依赖解析的依赖项? 我的意思是这个依赖项不托管在公共Maven上。 - Tareq Islam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接