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..12a5ffff 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..765d3a47 100644 --- a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy @@ -721,11 +721,13 @@ 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 +744,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 +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)}\" -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..b50fe1b5 100644 --- a/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy @@ -101,11 +101,11 @@ class ToolsLocator { 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 ?: osdetector.classifier, - ext:extension ?: 'exe', + 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())