From 337d8c49eb0d2473eef9edf1cf807b8dc115e6e0 Mon Sep 17 00:00:00 2001 From: 16K <767743748@qq.com> Date: Wed, 8 Nov 2023 15:02:22 +0800 Subject: [PATCH 1/6] Gradle dsl to specify the mainClass for protocPlugin --- README.md | 5 +++++ .../google/protobuf/gradle/ExecutableLocator.groovy | 9 +++++++++ .../google/protobuf/gradle/GenerateProtoTask.groovy | 10 +++++----- .../com/google/protobuf/gradle/ToolsLocator.groovy | 5 +++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 48b27750..9955ac40 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,11 @@ protobuf {      // or      // path = 'tools/protoc-gen-grpc-java'    } + dubbo { + artifact = "org.apache.dubbo:dubbo-compiler:${dubboVersion}" + // optional (jar main-class) + // mainClass = "org.apache.dubbo.gen.grpc.reactive.ReactorDubboGrpcGenerator" + } // Any other plugins ...  } diff --git a/src/main/groovy/com/google/protobuf/gradle/ExecutableLocator.groovy b/src/main/groovy/com/google/protobuf/gradle/ExecutableLocator.groovy index b20b5b7b..7ba9cfd4 100644 --- a/src/main/groovy/com/google/protobuf/gradle/ExecutableLocator.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/ExecutableLocator.groovy @@ -46,6 +46,7 @@ class ExecutableLocator implements Named { private String artifact private String path + private String mainClass; private FileCollection artifactFiles private String simplifiedArtifactName @@ -84,6 +85,14 @@ class ExecutableLocator implements Named { return path } + String getMainClass() { + return mainClass + } + + void setMainClass(String mainClass) { + this.mainClass = mainClass + } + @PackageScope FileCollection getArtifactFiles() { Preconditions.checkState(path == null, 'Not artifact based') diff --git a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy index 4ce6d6d1..940caba1 100644 --- a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy @@ -721,11 +721,11 @@ public abstract class GenerateProtoTask extends DefaultTask { protected String computeExecutablePath(ExecutableLocator locator) { if (locator.path != null) { - return locator.path.endsWith(JAR_SUFFIX) ? createJarTrampolineScript(locator.path) : locator.path + return locator.path.endsWith(JAR_SUFFIX) ? createJarTrampolineScript(locator.path, locator.mainClass) : locator.path } File file = locator.artifactFiles.singleFile if (file.name.endsWith(JAR_SUFFIX)) { - return createJarTrampolineScript(file.getAbsolutePath()) + return createJarTrampolineScript(file.getAbsolutePath(), locator.mainClass) } if (!file.canExecute() && !file.setExecutable(true)) { @@ -742,7 +742,7 @@ public abstract class GenerateProtoTask extends DefaultTask { * @param jarAbsolutePath Absolute path to the .jar file. * @return The absolute path to the trampoline executable script. */ - private String createJarTrampolineScript(String jarAbsolutePath) { + private String createJarTrampolineScript(String jarAbsolutePath, String mainClass) { assert jarAbsolutePath.endsWith(JAR_SUFFIX) boolean isWindows = isWindows() String jarFileName = new File(jarAbsolutePath).getName() @@ -758,8 +758,8 @@ public abstract class GenerateProtoTask extends DefaultTask { // Rewrite the trampoline file unconditionally (even if it already exists) in case the dependency or versioning // changes we don't need to detect the delta (and the file content is cheap to re-generate). String trampoline = isWindows ? - "@ECHO OFF\r\n\"${escapePathWindows(javaExe)}\" -jar \"${escapePathWindows(jarAbsolutePath)}\" %*\r\n" : - "#!/bin/sh\nexec '${escapePathUnix(javaExe)}' -jar '${escapePathUnix(jarAbsolutePath)}' \"\$@\"\n" + "@ECHO OFF\r\n\"${escapePathWindows(javaExe)}\" ${mainClass ? "-cp" : "-jar"} \"${escapePathWindows(jarAbsolutePath)}\" ${mainClass} %*\r\n" : + "#!/bin/sh\nexec '${escapePathUnix(javaExe)}' ${mainClass ? "-cp" : "-jar"} '${escapePathUnix(jarAbsolutePath)}' ${mainClass} \"\$@\"\n" scriptExecutableFile.write(trampoline, US_ASCII.name()) setExecutableOrFail(scriptExecutableFile) logger.info("Resolved artifact jar: ${jarAbsolutePath}. Created trampoline file: ${scriptExecutableFile}") diff --git a/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy b/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy index de70447a..5a3c0f1f 100644 --- a/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy @@ -96,6 +96,7 @@ class ToolsLocator { conf.visible = false conf.transitive = false } + def mainClass = locator.mainClass String groupId, artifact, version, classifier, extension OsDetector osdetector = project.extensions.getByName("osdetector") as OsDetector List parts = artifactParts(locator.artifact) @@ -104,8 +105,8 @@ class ToolsLocator { group:groupId, name:artifact, version:version, - classifier:classifier ?: osdetector.classifier, - ext:extension ?: 'exe', + classifier:classifier ?: mainClass ? null : osdetector.classifier, + ext:extension ?: mainClass ? 'jar' : 'exe', ] project.dependencies.add(config.name, notation) locator.resolve(config, "$groupId:$artifact:$version".toString()) From 586bda04d02993f992cb418346b8330ca87fb4fc Mon Sep 17 00:00:00 2001 From: 16K <767743748@qq.com> Date: Thu, 9 Nov 2023 09:39:15 +0800 Subject: [PATCH 2/6] Fix failure caused by string --- .../com/google/protobuf/gradle/GenerateProtoTask.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy index 940caba1..cfa6c7ab 100644 --- a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy @@ -758,8 +758,8 @@ public abstract class GenerateProtoTask extends DefaultTask { // Rewrite the trampoline file unconditionally (even if it already exists) in case the dependency or versioning // changes we don't need to detect the delta (and the file content is cheap to re-generate). String trampoline = isWindows ? - "@ECHO OFF\r\n\"${escapePathWindows(javaExe)}\" ${mainClass ? "-cp" : "-jar"} \"${escapePathWindows(jarAbsolutePath)}\" ${mainClass} %*\r\n" : - "#!/bin/sh\nexec '${escapePathUnix(javaExe)}' ${mainClass ? "-cp" : "-jar"} '${escapePathUnix(jarAbsolutePath)}' ${mainClass} \"\$@\"\n" + "@ECHO OFF\r\n\"${escapePathWindows(javaExe)}\" \"${mainClass ? "-cp" : "-jar"}\" \"${escapePathWindows(jarAbsolutePath)}\" \"${mainClass}\" %*\r\n" : + "#!/bin/sh\nexec '${escapePathUnix(javaExe)}' '${mainClass ? "-cp" : "-jar"}' '${escapePathUnix(jarAbsolutePath)}' '${mainClass}' \"\$@\"\n" scriptExecutableFile.write(trampoline, US_ASCII.name()) setExecutableOrFail(scriptExecutableFile) logger.info("Resolved artifact jar: ${jarAbsolutePath}. Created trampoline file: ${scriptExecutableFile}") From 710bb0b8278c762800efcc4cf75f90518f9de80d Mon Sep 17 00:00:00 2001 From: 16K <767743748@qq.com> Date: Thu, 9 Nov 2023 10:55:04 +0800 Subject: [PATCH 3/6] Adding judgments to make the code clearer --- .../protobuf/gradle/ToolsLocator.groovy | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy b/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy index 5a3c0f1f..628a65b2 100644 --- a/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy @@ -96,18 +96,31 @@ class ToolsLocator { conf.visible = false conf.transitive = false } - def mainClass = locator.mainClass String groupId, artifact, version, classifier, extension OsDetector osdetector = project.extensions.getByName("osdetector") as OsDetector List parts = artifactParts(locator.artifact) (groupId, artifact, version, classifier, extension) = [parts[0], parts[1], parts[2], parts[3], parts[4]] - Map notation = [ - group:groupId, - name:artifact, - version:version, - classifier:classifier ?: mainClass ? null : osdetector.classifier, - ext:extension ?: mainClass ? 'jar' : 'exe', - ] + + String mainClass = locator.mainClass + Map notation; + if (mainClass == null) { + notation = [ + group:groupId, + name:artifact, + version:version, + classifier:classifier ?: osdetector.classifier, + ext:extension ?: 'exe', + ] + }else { + notation = [ + group:groupId, + name:artifact, + version:version, + classifier:classifier ?: null, + ext:extension ?: 'jar', + ] + } + project.dependencies.add(config.name, notation) locator.resolve(config, "$groupId:$artifact:$version".toString()) } From 8242dee465966b7b10f328ed0574ab472090453a Mon Sep 17 00:00:00 2001 From: 16K <767743748@qq.com> Date: Thu, 16 Nov 2023 10:57:59 +0800 Subject: [PATCH 4/6] Modify symbols --- .../com/google/protobuf/gradle/GenerateProtoTask.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy index cfa6c7ab..f26ed9c4 100644 --- a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy @@ -758,8 +758,8 @@ public abstract class GenerateProtoTask extends DefaultTask { // Rewrite the trampoline file unconditionally (even if it already exists) in case the dependency or versioning // changes we don't need to detect the delta (and the file content is cheap to re-generate). String trampoline = isWindows ? - "@ECHO OFF\r\n\"${escapePathWindows(javaExe)}\" \"${mainClass ? "-cp" : "-jar"}\" \"${escapePathWindows(jarAbsolutePath)}\" \"${mainClass}\" %*\r\n" : - "#!/bin/sh\nexec '${escapePathUnix(javaExe)}' '${mainClass ? "-cp" : "-jar"}' '${escapePathUnix(jarAbsolutePath)}' '${mainClass}' \"\$@\"\n" + "@ECHO OFF\r\n\"${escapePathWindows(javaExe)}\" ${mainClass ? "-cp" : "-jar"} \"${escapePathWindows(jarAbsolutePath)}\" \"${mainClass}\" %*\r\n" : + "#!/bin/sh\nexec '${escapePathUnix(javaExe)}' ${mainClass ? "-cp" : "-jar"} '${escapePathUnix(jarAbsolutePath)}' '${mainClass}' \"\$@\"\n" scriptExecutableFile.write(trampoline, US_ASCII.name()) setExecutableOrFail(scriptExecutableFile) logger.info("Resolved artifact jar: ${jarAbsolutePath}. Created trampoline file: ${scriptExecutableFile}") From a0cb402f32c28822c72855ee3c9764a7fdfbae9b Mon Sep 17 00:00:00 2001 From: 16K <767743748@qq.com> Date: Fri, 17 Nov 2023 10:55:21 +0800 Subject: [PATCH 5/6] Cancel modifications to ToolsLocator --- .../protobuf/gradle/ToolsLocator.groovy | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy b/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy index 628a65b2..b50fe1b5 100644 --- a/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy @@ -100,27 +100,13 @@ class ToolsLocator { OsDetector osdetector = project.extensions.getByName("osdetector") as OsDetector List parts = artifactParts(locator.artifact) (groupId, artifact, version, classifier, extension) = [parts[0], parts[1], parts[2], parts[3], parts[4]] - - String mainClass = locator.mainClass - Map notation; - if (mainClass == null) { - notation = [ - group:groupId, - name:artifact, - version:version, - classifier:classifier ?: osdetector.classifier, - ext:extension ?: 'exe', - ] - }else { - notation = [ - group:groupId, - name:artifact, - version:version, - classifier:classifier ?: null, - ext:extension ?: 'jar', - ] - } - + Map notation = [ + group:groupId, + name:artifact, + version:version, + classifier:classifier ?: osdetector.classifier, + ext:extension ?: 'exe', + ] project.dependencies.add(config.name, notation) locator.resolve(config, "$groupId:$artifact:$version".toString()) } From d509edcda378c556987c6bfb3c335ea8a8535862 Mon Sep 17 00:00:00 2001 From: 16K <767743748@qq.com> Date: Sat, 11 May 2024 16:45:47 +0800 Subject: [PATCH 6/6] Fix the issue of failed codenarc verification --- .../google/protobuf/gradle/ExecutableLocator.groovy | 2 +- .../google/protobuf/gradle/GenerateProtoTask.groovy | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/groovy/com/google/protobuf/gradle/ExecutableLocator.groovy b/src/main/groovy/com/google/protobuf/gradle/ExecutableLocator.groovy index 7ba9cfd4..12a5ffff 100644 --- a/src/main/groovy/com/google/protobuf/gradle/ExecutableLocator.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/ExecutableLocator.groovy @@ -46,7 +46,7 @@ class ExecutableLocator implements Named { private String artifact private String path - private String mainClass; + private String mainClass private FileCollection artifactFiles private String simplifiedArtifactName diff --git a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy index f26ed9c4..765d3a47 100644 --- a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy @@ -721,7 +721,9 @@ public abstract class GenerateProtoTask extends DefaultTask { protected String computeExecutablePath(ExecutableLocator locator) { if (locator.path != null) { - return locator.path.endsWith(JAR_SUFFIX) ? createJarTrampolineScript(locator.path, locator.mainClass) : locator.path + return locator.path.endsWith(JAR_SUFFIX) ? + createJarTrampolineScript(locator.path, locator.mainClass) : + locator.path } File file = locator.artifactFiles.singleFile if (file.name.endsWith(JAR_SUFFIX)) { @@ -758,8 +760,10 @@ public abstract class GenerateProtoTask extends DefaultTask { // Rewrite the trampoline file unconditionally (even if it already exists) in case the dependency or versioning // changes we don't need to detect the delta (and the file content is cheap to re-generate). String trampoline = isWindows ? - "@ECHO OFF\r\n\"${escapePathWindows(javaExe)}\" ${mainClass ? "-cp" : "-jar"} \"${escapePathWindows(jarAbsolutePath)}\" \"${mainClass}\" %*\r\n" : - "#!/bin/sh\nexec '${escapePathUnix(javaExe)}' ${mainClass ? "-cp" : "-jar"} '${escapePathUnix(jarAbsolutePath)}' '${mainClass}' \"\$@\"\n" + "@ECHO OFF\r\n\"${escapePathWindows(javaExe)}\" ${mainClass ? "-cp" : "-jar"} " + + "\"${escapePathWindows(jarAbsolutePath)}\" \"${mainClass}\" %*\r\n" : + "#!/bin/sh\nexec '${escapePathUnix(javaExe)}' ${mainClass ? "-cp" : "-jar"} " + + "'${escapePathUnix(jarAbsolutePath)}' '${mainClass}' \"\$@\"\n" scriptExecutableFile.write(trampoline, US_ASCII.name()) setExecutableOrFail(scriptExecutableFile) logger.info("Resolved artifact jar: ${jarAbsolutePath}. Created trampoline file: ${scriptExecutableFile}")