我试图发布一个由Gradle 6.0创建的模糊JAR。1个ProGuard插件到Maven存储库。在过去的几天里,我学到了很多关于Gradle配置、变体和工件的知识,但我似乎无法做到这一点。我相信相关文件就是这里的文件。
我创建了一个简单的示例,展示了我在Github上的预期设置。
如果我运行/gradlew publish
在这个项目中,我得到了以下错误。
Execution failed for task ':publishMyLibraryPublicationToMyRepoRepository'.
> Failed to publish publication 'myLibrary' to repository 'myRepo'
> Invalid publication 'myLibrary': multiple artifacts with the identical extension and classifier ('jar', 'null').
我还尝试了不推荐的maven
插件。不幸的是,这个插件忽略了定制的ProGuard jar。
有人能给我一些建议,告诉我如何用proguard任务中模糊的JAR替换JAR任务中原来的JAR吗?
编辑:我能够从这个线程得到一个解决方案。Github上的最小示例包含修补过的版本。随意看看。我将把工作build.gradle变成下面的答案。
正如我对这个问题所做的编辑一样,我找到了一个解决方案,并相应地更新了Github项目。因为Stackoverflow喜欢本地信息,而不依赖于链接,所以我发布了工作构建。gradle文件作为答案。Github项目的其余部分只是由gradleinit
创建的Java库项目。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:6.2.2'
classpath 'net.sf.proguard:proguard-base:6.2.2'
}
}
plugins {
id 'java-library'
id 'maven-publish'
}
group = 'org.example'
version = '1.0.0'
repositories {
jcenter()
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.guava:guava:23.0'
testImplementation 'junit:junit:4.12'
}
task createObfuscated(type: proguard.gradle.ProGuardTask, dependsOn: 'jar') {
description 'Optimizes and obfuscates the created distribution jar.'
verbose
injars "${buildDir}/libs/${project.name}-${version}.jar"
outjars "${buildDir}/obf/${project.name}-${version}.jar"
if (System.getProperty('java.version').startsWith('1.')) {
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
} else {
libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class'
}
libraryjars configurations.findByName('runtimeClasspath').getFiles()
printmapping 'out.map'
keep 'public class * { \
public protected *; \
}'
keepclassmembers allowoptimization: true, 'enum * { \
public static **[] values(); \
public static ** valueOf(java.lang.String); \
}'
keepclassmembers 'class * implements java.io.Serializable { \
static final long serialVersionUID; \
static final java.io.ObjectStreamField[] serialPersistentFields; \
private void writeObject(java.io.ObjectOutputStream); \
private void readObject(java.io.ObjectInputStream); \
java.lang.Object writeReplace(); \
java.lang.Object readResolve(); \
}'
overloadaggressively
}
task copyObfuscated(type: Copy, dependsOn: createObfuscated) {
from "${buildDir}/obf"
into "${buildDir}/libs"
include '*.jar'
}
task deleteObfuscated(type: Delete, dependsOn: copyObfuscated) {
delete '${buildDir}/obf'
}
task proguard dependsOn deleteObfuscated
publishing {
publications {
myLibrary(MavenPublication) {
from components.java
}
}
repositories {
maven {
name = 'myRepo'
url = "file://${buildDir}/repo"
}
}
}
publish.dependsOn proguard
wrapper {
gradleVersion '6.0.1'
}
添加分类器="proGuard"
解决了这个问题,尽管我不熟悉proGuard来确定发布是否正确。
artifacts {
proguard(new File(proguard.outJarFiles[0])) {
builtBy(proguard)
classifier = "proguard"
}
}
以下是为我发表的:
我可以看到原来的JAR是592字节,而proguard是410字节,所以我假设它工作正常。
此外,在调试您的问题时,我进行了重构,以使用我建议使用的Kotlin DSL。
import proguard.gradle.ProGuardTask
plugins {
`java-library`
`maven-publish`
}
buildscript {
repositories {
jcenter()
}
dependencies {
classpath("net.sf.proguard:proguard-gradle:6.2.2")
}
}
group = "org.example"
version = "1.0.0"
repositories {
jcenter()
}
configurations {
val implementation by this
val runtimeOnly by this
create("proguard") {
isCanBeConsumed = false
isCanBeResolved = false
extendsFrom(implementation, runtimeOnly)
attributes {
attribute(Attribute.of("org.gradle.usage", String::class.java), Usage.JAVA_API)
attribute(Attribute.of("org.gradle.category", String::class.java), Category.LIBRARY)
attribute(Attribute.of("org.gradle.libraryelements", String::class.java), LibraryElements.JAR)
attribute(Attribute.of("org.gradle.dependency.bundling", String::class.java), Bundling.EXTERNAL)
}
}
}
dependencies {
api("org.apache.commons:commons-math3:3.6.1")
implementation("com.google.guava:guava:23.0")
testImplementation("junit:junit:4.12")
}
val proguard by tasks.registering(ProGuardTask::class) {
description = "Optimizes and obfuscates the created distribution jar."
dependsOn(tasks.named("jar"))
verbose()
injars("$buildDir/libs/${project.name}-${project.version}.jar")
outjars("$buildDir/proguard/${project.name}-${version}.jar")
if (System.getProperty("java.version").startsWith("1.")) {
libraryjars("${System.getProperty("java.home")}/lib/rt.jar")
} else {
libraryjars(mapOf("jarfilter" to "!**.jar", "filter" to "!module-info.class"), "${System.getProperty("java.home")}/jmods/java.base.jmod")
}
libraryjars(configurations.named("runtimeClasspath").get().files)
printmapping("out.map")
keep("""
public class * {
public protected *;
}
""".trimIndent())
keepclassmembers(mapOf("allowoptimization" to true), """
enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
""".trimIndent())
keepclassmembers("""
class * implements java.io.Serializable {
static final long serialVersionUID;
static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace ();
java.lang.Object readResolve ();
}
""".trimIndent())
overloadaggressively()
}
val javaComponent = project.components.findByName("java") as AdhocComponentWithVariants
javaComponent.addVariantsFromConfiguration(configurations.getByName("proguard")) {
// I have no idea what I should do here and the documentation is very confusing
}
publishing {
publications {
create<MavenPublication>("myLibrary") {
from(components["java"])
artifact(proguard.get().outJarFiles[0]) {
builtBy(proguard.get())
classifier = "proguard"
}
}
}
repositories {
maven {
name = "myRepo"
url = uri("file://${buildDir}/repo")
}
}
}
tasks.named("publish").configure {
dependsOn(tasks.named("proguard"))
}
我以一个新的gradle用户的身份创建gradle版本,但我过去曾与maven合作过。 我试图重现maven发布插件的动作: 将分支版本更改为发行号(在svn提交) 如您所见,我正在使用: Nexus OSS作为版本控制库 SVN作为scm Gradle(2.8) 我正试图通过这两个插件实现我的目标: > 将分支版本更改为发行号(在svn提交) 创建标签(位于svn) 将分支版本更改为新快照编号(
我最近尝试使用,因为它显然是Maven宇宙中构建和包发布的推荐方式。 但是我想在Eclipse中使用它,因为我的开发工作流程的其余部分是基于Eclipse的。我通常通过作为Eclipse Juno(4.2)的一部分提供的m2eclipse插件运行Maven命令 当我尝试在 Eclipse 中运行 “release:prepare” 时,我注意到了一些奇怪的事情: 在根项目目录中创建了一些额外的文件
我试图使用目标 release:prepare 生成一个版本,但是当我在 Eclipse 上运行它时,我得到了错误: 无法执行目标org.apache.maven.plugins:maven-estes-plugin:2.0-beta-7:项目mwFramework上的准备(default-cli):无法运行目标清理验证:执行过程中出错。无法运行程序“mvn”(在目录“/home/gnng/Dev
2)有没有一种方法可以不使用这个pom,而是配置teamcity构建步骤,直接从gradle构建发布?
我对所有项目都有一个主POM。POM包含以下SCM部分: https://user:**********@bitbucket.server.de/scm/tsu/maven-master.git refs/heads/dev:refs/heads/dev 对于多模块项目的非工作版本,它使用 https://user:**********@bitbucket.server.de/scm/tsu/pr
我用的是孔晨的招摇maven插件。此外,我还使用maven发布插件。大摇大摆。由swagger maven插件生成的json不是repo的一部分。如果我用mvn包构建应用程序,那就太夸张了。json被生成并成为jar的一部分。 如果我用maven release插件发布应用程序,那就大摇大摆了。json不是jar文件的一部分。我查看了日志,发现maven release插件有三个步骤——发布:清理