From 35790562495f95266d57ccdb6fcc298e914eae47 Mon Sep 17 00:00:00 2001 From: Dawid Weiss Date: Wed, 12 Aug 2020 16:28:48 +0200 Subject: [PATCH] Standalone distribution assembly and 'run' task for Luke (#1742) Co-authored-by: Tomoko Uchida --- lucene/luke/build.gradle | 132 +++++++++++++++++++++++- lucene/luke/src/distribution/README.txt | 6 ++ 2 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 lucene/luke/src/distribution/README.txt diff --git a/lucene/luke/build.gradle b/lucene/luke/build.gradle index 6e32b1b35a5..f6df53cbee6 100644 --- a/lucene/luke/build.gradle +++ b/lucene/luke/build.gradle @@ -14,14 +14,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.apache.tools.ant.taskdefs.condition.Os +import org.apache.tools.ant.filters.* +import java.nio.file.Files apply plugin: 'java-library' description = 'Luke - Lucene Toolbox' +ext { + standaloneDistDir = file("$buildDir/${archivesBaseName}-${project.version}") +} + +configurations { + standalone + implementation.extendsFrom standalone +} + dependencies { api project(':lucene:core') + implementation 'org.apache.logging.log4j:log4j-core' + implementation project(':lucene:codecs') implementation project(':lucene:backward-codecs') implementation project(':lucene:analysis:common') @@ -29,7 +43,123 @@ dependencies { implementation project(':lucene:queryparser') implementation project(':lucene:misc') - implementation 'org.apache.logging.log4j:log4j-core' + standalone project(":lucene:highlighter") + standalone project(':lucene:analysis:icu') + standalone project(':lucene:analysis:kuromoji') + standalone project(':lucene:analysis:morfologik') + standalone project(':lucene:analysis:nori') + standalone project(':lucene:analysis:opennlp') + standalone project(':lucene:analysis:phonetic') + standalone project(':lucene:analysis:smartcn') + standalone project(':lucene:analysis:stempel') + standalone project(':lucene:suggest') testImplementation project(':lucene:test-framework') } + +// Configure main class name for all JARs. +tasks.withType(Jar) { + manifest { + attributes("Main-Class": "org.apache.lucene.luke.app.desktop.LukeMain") + } +} + +// Configure the default JAR without any class path information +// (this may actually be wrong - perhaps we should add the +// "distribution" paths here. +jar { + manifest { + } +} + +// Configure "stand-alone" JAR with proper dependency classpath links. +task standaloneJar(type: Jar) { + dependsOn classes + + archiveFileName = "${archivesBaseName}-${project.version}-standalone.jar" + + from(sourceSets.main.output) + + // manifest attributes are resolved eagerly and we can't access runtimeClasspath + // at configuration time so push it until execution. + doFirst { + manifest { + attributes("Class-Path": configurations.runtimeClasspath.collect { + "${it.getName()}" + }.join(' ')) + } + } +} + +task standaloneAssemble(type: Sync) { + def antHelper = new org.apache.tools.ant.Project() + afterEvaluate { + def substituteProperties = [ + "required.java.version": project.java.targetCompatibility, + "luke.cmd": "${standaloneJar.archiveFileName.get()}" + ] + substituteProperties.each { k, v -> antHelper.setProperty(k.toString(), v.toString()) } + } + + from standaloneJar + from configurations.runtimeClasspath + + from(file("src/distribution"), { + filesMatching("README.txt", { + filteringCharset = 'UTF-8' + filter(ExpandProperties, project: antHelper) + }) + }) + + into standaloneDistDir + + doLast { + logger.lifecycle("Standalone Luke distribution assembled. You can run it with:\n" + + "java -jar " + file("${standaloneDistDir}/${standaloneJar.archiveFileName.get()}")) + } +} + +// Attach standalone distribution assembly to main assembly. +assemble.dependsOn standaloneAssemble + +// Create a standalone package bundle. +task standalonePackage(type: Tar) { + from standaloneAssemble + + into "${archivesBaseName}-${project.version}/" + + compression = Compression.GZIP + archiveFileName = "${archivesBaseName}-${project.version}-standalone.tgz" +} + +// Create a set of artifacts for standalone distribution in a specific +// exported configuration so that it can be pulled in by other projects. +artifacts { + standalone standaloneDistDir, { + builtBy standaloneAssemble + } +} + +// Utility to launch Luke (and fork it from the build). +task run() { + dependsOn standaloneAssemble + description "Launches (spawns) Luke directly from the build process." + group "Utility launchers" + + doFirst { + logger.lifecycle("Launching Luke ${project.version} right now...") + def javaExecutable = { + def registry = project.extensions.getByType(JavaInstallationRegistry) + def currentJvm = registry.installationForCurrentVirtualMachine.get() + currentJvm.getJavaExecutable().asFile + }() + ant.exec( + executable: javaExecutable, + spawn: true, + vmlauncher: true + ) { + arg(value: '-jar') + arg(value: file("${standaloneDistDir}/${standaloneJar.archiveFileName.get()}").absolutePath) + } + } +} diff --git a/lucene/luke/src/distribution/README.txt b/lucene/luke/src/distribution/README.txt new file mode 100644 index 00000000000..0efea2d309f --- /dev/null +++ b/lucene/luke/src/distribution/README.txt @@ -0,0 +1,6 @@ +This is Luke, Apache Lucene low-level index inspection and repair utility. + +Luke requires Java ${required.java.version}. You can start it with: +java -jar ${luke.cmd} + +Happy index hacking! \ No newline at end of file