plugins { id 'java' id 'idea' id 'eclipse' id 'maven-publish' id 'signing' id 'jacoco' id 'distribution' id 'checkstyle' id 'com.diffplug.spotless' version "5.12.1" id 'com.github.spotbugs' version "4.7.1" } tasks.withType(JavaCompile) { sourceCompatibility = 1.8 targetCompatibility = 1.8 options.encoding = "UTF-8" options.compilerArgs = [ "-Xlint:deprecation,unchecked" ] } compileTestJava { options.compilerArgs = [ ] } repositories { mavenCentral() } sourceSets { main { java { srcDirs 'src', 'toolsrc', 'xmlimplsrc' } resources { srcDirs 'src', 'toolsrc' exclude "build.xml" exclude "manifest" } } test { java { srcDirs "testsrc", 'examples' exclude 'tests/**' } resources { srcDirs "testsrc" } } jmh { java { srcDirs "benchmarks" } compileClasspath += sourceSets.test.runtimeClasspath runtimeClasspath += sourceSets.test.runtimeClasspath } } dependencies { testImplementation "junit:junit:4.13.2" testImplementation "org.yaml:snakeyaml:1.28" testImplementation "javax.xml.soap:javax.xml.soap-api:1.4.0" jmhImplementation project jmhImplementation 'org.openjdk.jmh:jmh-core:1.27' jmhAnnotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.27' } test { useJUnit() exclude "**/benchmarks/**" jvmArgs += '-Xss1280k' if (JavaVersion.current() > JavaVersion.VERSION_1_8) { jvmArgs += ['--add-opens', 'java.desktop/javax.swing.table=ALL-UNNAMED'] } jacoco.excludes = ['**/testsrc_tests_ecma_3_RegExp_perlstress*'] systemProperty 'java.awt.headless', 'true' systemProperty 'mozilla.js.tests', 'testsrc/tests' systemProperty 'mozilla.js.tests.timeout', 60000 systemProperty 'user.language', 'en' systemProperty 'user.country', 'US' systemProperty 'user.timezone', 'America/Los_Angeles' systemProperty 'file.encoding', 'UTF-8' if (System.getProperty('quick') != null) { systemProperty 'TEST_OPTLEVEL', -1 } else if (System.getProperty('optLevel')) { systemProperty 'TEST_OPTLEVEL', System.getProperty('optLevel') } systemProperty 'test262properties', System.getProperty('test262properties') if (System.getProperty('updateTest262properties') != null) { systemProperty 'updateTest262properties', System.getProperty('updateTest262properties') } maxHeapSize = "1g" testLogging.showStandardStreams = true // Many tests do not clean up contexts properly. This makes the tests much // more resilient at the expense of performance. forkEvery = 1 maxParallelForks = 64 } task sunSpiderBenchmark(type: JavaExec) { classpath = sourceSets.jmh.runtimeClasspath mainClass = 'org.openjdk.jmh.Main' args '-f', '1', '-bm', 'avgt', 'SunSpider' } task v8Benchmark(type: JavaExec) { classpath = sourceSets.jmh.runtimeClasspath mainClass = 'org.openjdk.jmh.Main' args '-f', '1', '-i', '10', '-bm', 'avgt', '-tu', 'us', 'V8' } task testBenchmark() {} testBenchmark.dependsOn sunSpiderBenchmark testBenchmark.dependsOn v8Benchmark task microBenchmark(type: JavaExec, description: 'JMH micro benchmark') { def benchmark = System.getProperty('benchmark') if (benchmark == null) { benchmark = "MathBenchmark" } classpath = sourceSets.jmh.runtimeClasspath mainClass = 'org.openjdk.jmh.Main' args '-f', '1', '-bm', 'avgt', '-tu', 'ns', '-r', '5', benchmark } task listBenchmarks(type: JavaExec, description: 'JMH benchmarks') { classpath = sourceSets.jmh.runtimeClasspath mainClass = 'org.openjdk.jmh.Main' args '-lp' } task jmhHelp(type: JavaExec, description: 'JMH benchmarks') { classpath = sourceSets.jmh.runtimeClasspath mainClass = 'org.openjdk.jmh.Main' args '-help' } idea { module { excludeDirs += file('testsrc/tests/src') excludeDirs += file('buildGradle') excludeDirs += file('build') excludeDirs += file('.idea') excludeDirs += file('lib') } } tasks.withType(AbstractArchiveTask).configureEach { // Reproducible jar files preserveFileTimestamps = false reproducibleFileOrder = true } task runtimeJar(type: Jar) { dependsOn compileJava archiveBaseName = 'rhino-runtime' from sourceSets.main.output from ('LICENSE.txt') { into 'META-INF' } from ('NOTICE.txt') { into 'META-INF' } excludes = ["org/mozilla/javascript/tools", "org/mozilla/javascript/engine/**", "META-INF/services/**"] manifest { attributes( "Manifest-Version": "1.0", "Implementation-Version": project.version, "Implementation-Title": "Mozilla Rhino", "Implementation-Vendor": "Mozilla Foundation", "Implementation-URL": "http://www.mozilla.org/rhino", "Bundle-ManifestVersion": "2", "Bundle-SymbolicName": "org.mozilla.rhino-runtime", "Bundle-Version": project.version.replaceAll("-.*", ""), "Export-Package": "org.mozilla.javascript,org.mozilla.javascript.ast,org.mozilla.javascript.annotations", "Import-Package": "javax.lang.model,javax.script" ) } } task engineJar(type: Jar) { dependsOn compileJava archiveBaseName = 'rhino-engine' from (sourceSets.main.output) { include 'org/mozilla/javascript/engine/**' include 'META-INF/services/**' } from ('LICENSE.txt') { into 'META-INF' } manifest { attributes( "Manifest-Version": "1.0", "Implementation-Version": project.version, "Implementation-Title": "Mozilla Rhino ScriptEngine", "Implementation-Vendor": "Mozilla Foundation", "Implementation-URL": "http://www.mozilla.org/rhino", "Automatic-Module-Name": "org.mozilla.rhino.engine" ) } } jar { dependsOn compileJava from ('LICENSE.txt') { into 'META-INF' } from ('NOTICE.txt') { into 'META-INF' } from ('NOTICE-tools.txt') { into 'META-INF' } from sourceSets.main.output excludes = ["org/mozilla/javascript/engine/**", "META-INF/services/**"] // Class ImplementationVersion uses 'Implementation-Title' manifest { attributes( "Manifest-Version": "1.0", "Main-Class": "org.mozilla.javascript.tools.shell.Main", "Implementation-Version": project.version, "Implementation-Title": "Mozilla Rhino", "Implementation-Vendor": "Mozilla Foundation", "Implementation-URL": "http://www.mozilla.org/rhino", "Automatic-Module-Name": "org.mozilla.rhino", "Bundle-ManifestVersion": "2", "Bundle-SymbolicName": "org.mozilla.rhino", "Bundle-Version": project.version.replaceAll("-.*", ""), "Export-Package": "org.mozilla.javascript,org.mozilla.javascript.ast,org.mozilla.javascript.annotations", "Import-Package": "javax.lang.model,javax.script" ) } } javadoc { options.addBooleanOption("-allow-script-in-comments", true) options.addStringOption('Xdoclint:html', '-quiet') } task javadocJar(type: Jar) { archiveClassifier = 'javadoc' from javadoc } task runtimeJavadocJar(type: Jar) { archiveClassifier = 'javadoc' from javadoc exclude 'org/mozilla/javascript/tools', 'org/mozilla/javascript/engine' } task engineJavadocJar(type: Jar) { archiveClassifier = 'javadoc' from javadoc include 'org/mozilla/javascript/engine/**' } task sourceJar(type: Jar) { from sourceSets.main.allJava archiveClassifier = 'sources' from ('LICENSE.txt') { into 'META-INF' } from ('NOTICE.txt') { into 'META-INF' } from ('NOTICE-tools.txt') { into 'META-INF' } } task runtimeSourceJar(type: Jar) { archiveClassifier = 'sources' from sourceSets.main.allJava exclude 'org/mozilla/javascript/tools', 'org/mozilla/javascript/engine' from ('LICENSE.txt') { into 'META-INF' } from ('NOTICE.txt') { into 'META-INF' } } task engineSourceJar(type: Jar) { archiveClassifier = 'sources' from sourceSets.main.allJava include 'org/mozilla/javascript/engine/**' from ('LICENSE.txt') { into 'META-INF' } } publishing { publications { rhino(MavenPublication) { groupId 'org.mozilla' artifactId 'rhino' artifacts = [jar, sourceJar, javadocJar] pom.withXml { def root = asNode() root.appendNode('description', """ Rhino is an open-source implementation of JavaScript written entirely in Java. It is typically embedded into Java applications to provide scripting to end users. Full jar including tools, excluding the JSR-223 Script Engine wrapper. """) root.appendNode("url", "https://mozilla.github.io/rhino/") def p = root.appendNode("parent") p.appendNode("groupId", "org.sonatype.oss") p.appendNode("artifactId", "oss-parent") p.appendNode("version", "7") def l = root.appendNode("licenses").appendNode("license") l.appendNode("name", "Mozilla Public License, Version 2.0") l.appendNode("url", "http://www.mozilla.org/MPL/2.0/index.txt") def scm = root.appendNode("scm") scm.appendNode("connection", "scm:git:git@github.com:mozilla/rhino.git") scm.appendNode("developerConnection", "scm:git:git@github.com:mozilla/rhino.git") scm.appendNode("url", "git@github.com:mozilla/rhino.git") def o = root.appendNode("organization") o.appendNode("name", "The Mozilla Foundation") o.appendNode("url", "http://www.mozilla.org") } } rhinoruntime(MavenPublication) { groupId 'org.mozilla' artifactId 'rhino-runtime' artifacts = [runtimeJar, runtimeSourceJar, runtimeJavadocJar] pom.withXml { def root = asNode() root.appendNode('description', """ Rhino JavaScript runtime jar, excludes tools & JSR-223 Script Engine wrapper. """) root.appendNode("url", "https://mozilla.github.io/rhino/") def p = root.appendNode("parent") p.appendNode("groupId", "org.sonatype.oss") p.appendNode("artifactId", "oss-parent") p.appendNode("version", "7") def l = root.appendNode("licenses").appendNode("license") l.appendNode("name", "Mozilla Public License, Version 2.0") l.appendNode("url", "http://www.mozilla.org/MPL/2.0/index.txt") def scm = root.appendNode("scm") scm.appendNode("connection", "scm:git:git@github.com:mozilla/rhino.git") scm.appendNode("developerConnection", "scm:git:git@github.com:mozilla/rhino.git") scm.appendNode("url", "git@github.com:mozilla/rhino.git") def o = root.appendNode("organization") o.appendNode("name", "The Mozilla Foundation") o.appendNode("url", "http://www.mozilla.org") } } rhinoengine(MavenPublication) { groupId 'org.mozilla' artifactId 'rhino-engine' artifacts = [engineJar, engineSourceJar, engineJavadocJar] pom.withXml { def root = asNode() root.appendNode('description', """ Rhino Javascript JSR-223 Script Engine wrapper. """) root.appendNode("url", "https://mozilla.github.io/rhino/") def p = root.appendNode("parent") p.appendNode("groupId", "org.sonatype.oss") p.appendNode("artifactId", "oss-parent") p.appendNode("version", "7") def l = root.appendNode("licenses").appendNode("license") l.appendNode("name", "Mozilla Public License, Version 2.0") l.appendNode("url", "http://www.mozilla.org/MPL/2.0/index.txt") def scm = root.appendNode("scm") scm.appendNode("connection", "scm:git:git@github.com:mozilla/rhino.git") scm.appendNode("developerConnection", "scm:git:git@github.com:mozilla/rhino.git") scm.appendNode("url", "git@github.com:mozilla/rhino.git") def o = root.appendNode("organization") o.appendNode("name", "The Mozilla Foundation") o.appendNode("url", "http://www.mozilla.org") def deps = root.appendNode("dependencies") def rhino = deps.appendNode("dependency") rhino.appendNode("groupId", "org.mozilla") rhino.appendNode("artifactId", "rhino") rhino.appendNode("version", getVersion()) } } } if (project.hasProperty("mavenPassword")) { repositories { maven { credentials { username mavenUser password mavenPassword } if (project.version.endsWith('-SNAPSHOT')) { url mavenSnapshotRepo } else { url mavenReleaseRepo } } } } } signing { if (project.hasProperty('SIGNINGKEY')) { // Check for ORG_GRADLE_PROJECT_SIGNINGKEY environment variable for use in CI system. // Otherwise, do not sign. def signingKey = getProperty('SIGNINGKEY') def signingPassword = getProperty('SIGNINGPASSWORD') useInMemoryPgpKeys(signingKey, signingPassword) sign publishing.publications.rhino sign publishing.publications.rhinoengine sign publishing.publications.rhinoruntime } } spotbugs { effort = "less" reportLevel = "medium" excludeFilter = file("./spotbugs-exclude.xml") } spotless { java { googleJavaFormat().aosp() } } if (JavaVersion.current() > JavaVersion.VERSION_15 && (!System.properties.containsKey('org.gradle.jvmargs') || !System.properties.get('org.gradle.jvmargs').contains('com.sun.tools.javac.api')) && (!project.hasProperty('org.gradle.jvmargs') || !project.property('org.gradle.jvmargs').contains('com.sun.tools.javac.api'))) { tasks.named('check') { doFirst { logger.warn('WARNING: spotless plugin removed from check due to bug, ' + \ 'see README for a workaround when building with Java 16+.') } } spotless.enforceCheck false } jacocoTestReport { dependsOn test reports { csv.required = true html.required = true } } checkstyle { configFile = file("${projectDir}/checkstyle.xml") sourceSets = [ project.sourceSets.main ] } distributions { main { contents { from(sourceSets.main.java) { into 'rhino' + project.version + '/src' } from(sourceSets.main.resources) { exclude '**/*.java' into 'rhino' + project.version + '/src' } from(javadoc.destinationDir) { into 'rhino' + project.version + '/docs' } from(jar.outputs.files) { into 'rhino' + project.version + '/lib' } from(runtimeJar.outputs.files) { into 'rhino' + project.version + '/lib' } from(engineJar.outputs.files) { into 'rhino' + project.version + '/lib' } from(file(".")) { include '*.txt', '*.md', 'build.gradle', 'gradle.properties', 'gradle/**', 'gradlew', 'man/*.1' into 'rhino' + project.version } into "/" } } } distTar { dependsOn javadoc, jar compression = Compression.GZIP archiveExtension = 'tar.gz' } distZip.dependsOn javadoc, jar, sourceJar, runtimeSourceJar