import java.text.SimpleDateFormat buildscript { repositories { mavenCentral() maven { url 'https://jitpack.io' content { includeGroup "com.github.RyanTheAllmighty.gettext" includeGroup "com.github.ATLauncher.gradle-macappbundle" } } } dependencies { classpath 'com.github.RyanTheAllmighty.gettext:gettext-gradle-plugin:aab5c30bf8' classpath 'com.github.ATLauncher.gradle-macappbundle:edu.sc.seis.macAppBundle.gradle.plugin:d22f8cdb94' } } plugins { id 'java' id 'application' id 'org.cadixdev.licenser' version '0.6.1' id 'com.adarshr.test-logger' version '3.2.0' id 'edu.sc.seis.macAppBundle' version '2.3.0' id 'edu.sc.seis.launch4j' version '3.0.3' id 'de.undercouch.download' version '5.4.0' id 'com.github.johnrengelman.shadow' version '8.1.1' id 'com.github.ben-manes.versions' version '0.47.0' id 'com.apollographql.apollo' version '2.5.14' } apply plugin: 'org.mini2Dx.gettext' sourceCompatibility = '1.8' targetCompatibility = '1.8' group = 'com.aclauncher' version = rootProject.file('src/main/resources/version').text.trim().replace('.Beta', '') repositories { mavenCentral() gradlePluginPortal() maven { url 'https://libraries.minecraft.net' } maven { url 'https://jitpack.io' content { includeGroup "com.github.RyanTheAllmighty.gettext" includeGroup "com.github.Vatuu" includeGroup "com.gitlab.doomsdayrs" includeGroup "com.github.MCRcortex" } } } dependencies { implementation 'net.java.dev.jna:jna:5.13.0' implementation 'net.java.dev.jna:jna-platform:5.13.0' implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.guava:guava:32.1.1-jre' implementation 'org.tukaani:xz:1.9' implementation 'com.mojang:authlib:1.5.21' implementation 'net.iharder:base64:2.3.9' implementation 'com.github.Vatuu:discord-rpc:1.6.2' implementation 'net.sf.jopt-simple:jopt-simple:5.0.4' implementation 'org.zeroturnaround:zt-zip:1.15' implementation 'com.squareup.okhttp3:okhttp:4.11.0' implementation 'com.squareup.okhttp3:okhttp-tls:4.11.0' implementation 'io.sentry:sentry:6.25.0' implementation 'com.github.RyanTheAllmighty.gettext:gettext-lib:88ae68d897' implementation 'org.apache.logging.log4j:log4j-api:2.20.0' implementation 'org.apache.logging.log4j:log4j-core:2.20.0' implementation 'com.sangupta:murmur:1.0.0' implementation 'org.apache.commons:commons-lang3:3.12.0' implementation 'org.apache.commons:commons-text:1.10.0' implementation 'org.apache.commons:commons-compress:1.23.0' implementation 'com.formdev:flatlaf:3.1.1' implementation 'com.formdev:flatlaf-extras:3.1.1' implementation 'com.github.oshi:oshi-core:6.4.4' implementation 'net.freeutils:jlhttp:2.6' implementation 'joda-time:joda-time:2.12.5' implementation 'org.commonmark:commonmark:0.21.0' implementation 'com.github.hypfvieh:dbus-java:3.3.2' implementation 'com.apollographql.apollo:apollo-runtime:2.5.14' implementation 'com.apollographql.apollo:apollo-http-cache:2.5.14' implementation 'com.apollographql.apollo:apollo-rx3-support:2.5.14' implementation 'com.github.MCRcortex:nekodetector:Version-1.1-pre' // RxJava implementation("io.reactivex.rxjava3:rxjava:3.1.6") implementation("com.gitlab.doomsdayrs:rxswing:a5749ad421") // TODO tag testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-core:4.11.0' // Cannot update to 5.x.x as Java 11 min testImplementation 'org.mockito:mockito-inline:4.11.0' // Cannot update to 5.x.x as Java 11 min testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.3' testImplementation 'org.assertj:assertj-swing-junit:3.17.1' testImplementation 'org.mock-server:mockserver-netty:5.15.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.3' testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.9.3' } application { mainClass = 'com.aclauncher.App' applicationDefaultJvmArgs = [ "-Djna.nosys=true", "-Djava.net.preferIPv4Stack=true", "-Dawt.useSystemAAFontSettings=on", "-Dswing.aatext=true" ] } tasks.named('test') { // Use JUnit Platform for unit tests. useJUnitPlatform() testlogger { theme 'mocha' } } jar { manifest { attributes( 'SplashScreen-Image': '/assets/image/splash-screen.png', 'Implementation-Title': project.name, 'Implementation-Version': archiveVersion, 'Implementation-Vender': 'ACLauncher', 'Main-Class': 'com.aclauncher.App', 'Multi-Release': 'true' ) } } apollo { customTypeMapping = [ "ID" : "java.lang.String", "DateTime" : "java.util.Date" ] packageName = "com.aclauncher.graphql" } gettext { translations { srcDir = 'src' include = 'main/java/com/aclauncher/**/*.java' excludes = [ 'main/java/com/aclauncher/adapter/**/*.java', 'main/java/com/aclauncher/annot/**/*.java', 'main/java/com/aclauncher/collection/**/*.java', 'main/java/com/aclauncher/evnt/**/*.java', 'main/java/com/aclauncher/exceptions/**/*.java', 'main/java/com/aclauncher/interfaces/**/*.java', 'main/java/com/aclauncher/listener/**/*.java', 'main/java/com/aclauncher/utils/**/*.java' ] commentFormat = ' #. ' outputFilename = 'translations.pot' } } license { header = project.file('LICENSEHEADER') include '**/*.java' exclude 'io/github/**/*.java' exclude 'net/minecraft/**/*.java' exclude 'com/aclauncher/graphql/**/*.java' exclude 'com/aclauncher/gui/layouts/WrapLayout.java' newLine = false properties { year = currentYear() } } shadowJar { archiveClassifier.set(null) minimize { exclude(dependency('org.apache.logging.log4j:.*:.*')) exclude(dependency('com.formdev:.*:.*')) exclude(dependency('com.github.jnr:.*:.*')) exclude(dependency('com.github.hypfvieh:.*:.*')) exclude(dependency('org.apache.commons:commons-compress:.*')) } // these are included by dbus-java which is only used on Linux exclude("jni/x86_64-Windows/") exclude("jni/x86_64-SunOS/") exclude("jni/x86_64-OpenBSD/") exclude("jni/x86_64-FreeBSD/") exclude("jni/x86_64-DragonFlyBSD/") exclude("jni/sparcv9-SunOS/") exclude("jni/ppc-AIX/") exclude("jni/ppc64-AIX/") exclude("jni/i386-Windows/") exclude("jni/i386-SunOS/") exclude("jni/Darwin/") archiveClassifier.set('') } macAppBundle { mainClassName = 'com.aclauncher.App' appName = 'ACLauncher' appStyle = 'universalJavaApplicationStub' runtimeConfigurationName = 'shadow' jarTask = 'shadowJar' icon = 'src/main/resources/assets/image/icon.icns' javaProperties.put('user.dir', '$APP_ROOT/Contents/Java') javaProperties.put('apple.laf.useScreenMenuBar', 'true') javaExtras.put("-Djna.nosys", "true") javaExtras.put("-Djava.net.preferIPv4Stack", "true") javaExtras.put("-Dawt.useSystemAAFontSettings", "on") javaExtras.put("-Dswing.aatext", "true") bundleExtras.put("JVMVersion", project.targetCompatibility.toString() + "+") } copyToResourcesJava { rename("ACLauncher-${project.version}.jar", "ACLauncher.jar") } def currentYear() { def df = new SimpleDateFormat("yyyy") df.setTimeZone(TimeZone.getTimeZone("UTC")) return df.format(new Date()) } launch4j { outfile = "ACLauncher-${project.version}.exe" jreMinVersion = "${project.targetCompatibility.toString()}" mainClassName = 'com.aclauncher.App' icon = "${projectDir}/src/main/resources/assets/image/icon.ico" version = "${project.version}" textVersion = "${project.version}" copyright = "2013-${currentYear()} ${project.name}" companyName = "${project.name}" bundledJrePath = "jre/;%JAVA_HOME%;%PATH%" jvmOptions = [ "-Djna.nosys=true", "-Djava.net.preferIPv4Stack=true", "-Dawt.useSystemAAFontSettings=on", "-Dswing.aatext=true" ] } artifacts { archives shadowJar archives file(project.tasks.jar.getArchivePath().getPath().replace('.jar', '.exe').replace('libs', 'launch4j')) archives file(project.tasks.jar.getArchivePath().getPath().replace('.jar', '.zip').replace('libs', 'distributions')) } test { if (JavaVersion.current().isJava9Compatible()) { jvmArgs '--add-opens=java.base/sun.security.x509=ALL-UNNAMED' } } task copyArtifacts(type: Copy) { dependsOn build from shadowJar from file(project.tasks.jar.getArchivePath().getPath().replace('.jar', '.exe').replace('libs', 'launch4j')) from file(project.tasks.jar.getArchivePath().getPath().replace('.jar', '.zip').replace('libs', 'distributions')) into "${projectDir}/dist" } task downloadNewerUniversalJavaApplicationStub(type: Download) { description 'Downloads newer universalJavaApplicationStub' src 'https://raw.githubusercontent.com/tofi86/universalJavaApplicationStub/404f5c1b008d6296065de7a93406b387c9f3dce1/src/universalJavaApplicationStub' dest file("$buildDir/macApp/${project.name}.app/Contents/MacOS/universalJavaApplicationStub") overwrite true } task createTestLauncherDir { project.file('testLauncher/dev').mkdirs() } task createMacApp(type: Zip) { dependsOn createApp, shadowJar, downloadNewerUniversalJavaApplicationStub from("$buildDir/macApp") { include "${project.name}.app/**" exclude "${project.name}.app/Contents/MacOS" } from("$buildDir/macApp") { include "${project.name}.app/Contents/MacOS/**" fileMode 0777 } archiveFileName = "${project.name}-${project.version}.zip" } copyArtifacts.finalizedBy { println 'ACLauncher has been built. Distribution files are located in the dist directory.' } clean.doFirst { delete "${projectDir}/dist" } project.afterEvaluate { tasks.check { dependsOn -= tasks.find { it.name.equals("checkLicenses") } } } def shouldIgnoreUpdate = { String version -> return ['ALPHA', 'BETA', 'RC', '-M'].any { it -> version.toUpperCase().contains(it) }} tasks.named("dependencyUpdates").configure { rejectVersionIf { shouldIgnoreUpdate(it.candidate.version) } } build.finalizedBy copyArtifacts shadowJar.dependsOn jar build.dependsOn createExe, createMacApp startScripts.dependsOn shadowJar createExe.dependsOn shadowJar createAppZip.dependsOn downloadNewerUniversalJavaApplicationStub createDmg.dependsOn downloadNewerUniversalJavaApplicationStub