apply plugin: 'application' apply plugin: 'maven-publish' group 'org.innercore.zotecoreloader' version 'beta-1.2.0' application { mainClass = 'com.reider745.Main' } repositories { mavenCentral() google() ivy { name 'dex2jarV24Release' url 'https://github.com/pxb1988/dex2jar/releases/download' patternLayout { artifact 'v[revision]/[artifact]-v[revision].[ext]' } metadataSources { artifact() } content { includeModule 'com.googlecode.dex2jar', 'dex-tools' } } maven { url 'https://repo.lanink.com/repository/maven-public/' } maven { url 'https://repo.opencollab.dev/maven-releases/' } maven { url 'https://repo.opencollab.dev/maven-snapshots/' } maven { name "innercoreSnapshots" url "https://maven.inner-core.org/snapshots" } } configurations { // Isolated classpath for the forked codegen JVM (the :codegen subproject + JavaParser). codegenClasspath // The official v2.4 distribution is not published as a Maven module. dex2jarV24Distribution } def dex2jarV24Directory = file("$buildDir/dependencies/dex2jar-v2.4") def dex2jarV24Jars = [ 'd2j-base-cmd-v2.4.jar', 'dex-ir-v2.4.jar', 'dex-reader-api-v2.4.jar', 'dex-reader-v2.4.jar', 'dex-tools-v2.4.jar', 'dex-translator-v2.4.jar', 'dex-writer-v2.4.jar', 'asm-9.5.jar', 'asm-analysis-9.5.jar', 'asm-commons-9.5.jar', 'asm-tree-9.5.jar', 'asm-util-9.5.jar' ] def dex2jarV24ArchiveSha256 = 'ee7c45eb3c1d2474a6145d8d447e651a736a22d9664b6d3d3be5a5a817dda23a' dependencies { codegenClasspath project(':codegen') dex2jarV24Distribution('com.googlecode.dex2jar:dex-tools:2.4@zip') { transitive = false } // The repository POM is packaging=pom, so the JAR artifact must be explicit. implementation 'com.reider745.nukkit-mot:Nukkit-MOT:1.5.0-SNAPSHOT@jar' // https://mvnrepository.com/artifact/org.jetbrains/annotations implementation 'org.jetbrains:annotations:26.0.1' // https://central.sonatype.com/artifact/com.google.code.gson/gson/versions implementation group: 'com.google.code.gson', name: 'gson', version: '2.7' implementation group: 'org.mozilla.innercore', name: 'rhino', version: '1.7.15.1' // https://central.sonatype.com/artifact/org.json/json/versions implementation group: 'org.json', name: 'json', version: '20231013' implementation 'com.cedarsoftware:json-io:4.9.12' implementation fileTree(dir: dex2jarV24Directory, include: '*.jar') implementation 'org.javassist:javassist:3.29.1-GA' // Generated API-only Android compatibility stubs. This is the only // intentionally vendored JAR; rebuild it with rebuildAndroidStubs. implementation files('iclibs/android.jar') compileOnly 'com.android.support:support-annotations:25.3.1' compileOnly("org.projectlombok:lombok:1.18.44") annotationProcessor("org.projectlombok:lombok:1.18.44") testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } tasks.test { dependsOn 'generateApiBindingsTest' useJUnitPlatform() } def targetJavaVersion = 17 java { def javaVersion = JavaVersion.toVersion(targetJavaVersion) if (JavaVersion.current() < javaVersion) { toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) } withSourcesJar() } jar { duplicatesStrategy 'exclude' manifest { attributes 'Main-Class': application.mainClass } from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } } } run { workingDir 'target' standardInput System.in } // Generates JS-binding base classes (com.zhekasmirnov.innercore.api.gen.*BindGenBase) // from @ApiBinding-annotated sources, before compilation (the hand-written module classes // extend the generated bases). The generator lives in the :codegen subproject and runs in a // forked JVM so its JavaParser dependency stays isolated from Gradle's bundled copy. def apiGenSourceRoot = file('src/main/java/org/innercore') def apiGenOutputDir = layout.projectDirectory.dir('src/main/java/com/zhekasmirnov/innercore/api/gen') def apiGenSourceTestRoot = file('src/test/java/org/innercore') def apiGenOutputTestDir = layout.projectDirectory.dir('src/test/java/com/zhekasmirnov/innercore/api/gen') tasks.register('prepareDex2jarV24', Sync) { group = 'build setup' description = 'Downloads and extracts the exact dex2jar v2.4 libraries used by the legacy build.' def distribution = configurations.dex2jarV24Distribution inputs.files(distribution) from { distribution.collect { zipTree(it) } } include dex2jarV24Jars.collect { "**/lib/$it" } eachFile { details -> details.path = details.name } includeEmptyDirs = false into dex2jarV24Directory doFirst { def archive = distribution.singleFile def checksumProperty = 'dex2jarV24ArchiveSha256Actual' ant.checksum(file: archive, algorithm: 'SHA-256', property: checksumProperty) def actualSha256 = ant.project.properties[checksumProperty] if (actualSha256 != dex2jarV24ArchiveSha256) { throw new GradleException("Unexpected dex2jar v2.4 archive SHA-256: $actualSha256") } } doLast { def missing = dex2jarV24Jars.findAll { !file("$dex2jarV24Directory/$it").isFile() } if (!missing.isEmpty()) { throw new GradleException("dex2jar v2.4 archive is missing expected libraries: $missing") } } } tasks.register('generateApiBindingsTest', JavaExec) { group = 'codegen' description = 'Generates JS binding base classes from @ApiBinding-annotated sources.' javaLauncher = javaToolchains.launcherFor { def javaVersion = JavaVersion.toVersion(targetJavaVersion) if (JavaVersion.current() < javaVersion) { languageVersion = JavaLanguageVersion.of(targetJavaVersion) } } classpath = configurations.codegenClasspath mainClass = 'org.innercore.codegen.Codegen' args 'com.zhekasmirnov.innercore.api.gen', apiGenOutputTestDir.asFile.absolutePath, apiGenSourceTestRoot.absolutePath inputs.files(fileTree(apiGenSourceRoot) { include '**/*.java' }).withPropertyName('apiBindingSources') outputs.dir(apiGenOutputDir).withPropertyName('apiBindingOutput') } tasks.register('generateApiBindings', JavaExec) { group = 'codegen' description = 'Generates JS binding base classes from @ApiBinding-annotated sources.' javaLauncher = javaToolchains.launcherFor { def javaVersion = JavaVersion.toVersion(targetJavaVersion) if (JavaVersion.current() < javaVersion) { languageVersion = JavaLanguageVersion.of(targetJavaVersion) } } classpath = configurations.codegenClasspath mainClass = 'org.innercore.codegen.Codegen' args 'com.zhekasmirnov.innercore.api.gen', apiGenOutputDir.asFile.absolutePath, apiGenSourceRoot.absolutePath inputs.files(fileTree(apiGenSourceRoot) { include '**/*.java' }).withPropertyName('apiBindingSources') outputs.dir(apiGenOutputDir).withPropertyName('apiBindingOutput') } tasks.named('compileJava') { dependsOn 'generateApiBindings', 'prepareDex2jarV24' } task rebuildAndroidStubs(type: JavaExec, dependsOn: classes) { javaLauncher = javaToolchains.launcherFor { def javaVersion = JavaVersion.toVersion(targetJavaVersion) if (JavaVersion.current() < javaVersion) { languageVersion = JavaLanguageVersion.of(targetJavaVersion) } } classpath = sourceSets.main.runtimeClasspath mainClass = 'com.reider745.api.hooks.instrument.RebuildJavadoc' args '.todo/android.jar', 'iclibs/android.jar', 'proxy' } task rebuildZoteStubs(type: JavaExec, dependsOn: jar) { javaLauncher = javaToolchains.launcherFor { def javaVersion = JavaVersion.toVersion(targetJavaVersion) if (JavaVersion.current() < javaVersion) { languageVersion = JavaLanguageVersion.of(targetJavaVersion) } } classpath = sourceSets.main.runtimeClasspath mainClass = 'com.reider745.api.hooks.RebuildJavadoc' args "build/libs/${project.name}-${project.version}.jar", ".todo/${project.name}-${project.version}.jar" } tasks.jar { archiveFileName.set("${project.name}-${project.version}.jar") } publishing { publications { maven(MavenPublication) { from components.java } } repositories { maven { name = "innercore-releases" url = uri("https://maven.inner-core.org/releases") credentials { username = System.getenv("MAVEN_USERNAME") password = System.getenv("MAVEN_PASSWORD") } } } }