import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform plugins { id 'java' id 'application' id 'edu.sc.seis.launch4j' version '2.5.4' id 'org.openjfx.javafxplugin' version '0.1.0' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' id 'com.github.johnrengelman.shadow' version '8.1.1' apply false // 关闭 shadow } configurations { all*.exclude group: 'org.openjfx', module: 'javafx' proguardLib } javafx { version = "21" modules = [ 'javafx.controls', 'javafx.graphics', 'javafx.web' ] } // JDK 版本检查 def requiredJavaVersion = 20 def currentJavaVersion = JavaVersion.current().majorVersion.toInteger() if (currentJavaVersion != requiredJavaVersion) { throw new GradleException("构建需要 JDK ${requiredJavaVersion},但当前是 JDK ${currentJavaVersion}。请更换 JDK 环境。") } group = 'com.axis.innovators.box' version = '0.0.1' repositories { maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } maven { url 'https://jitpack.io' } mavenCentral() } dependencies { // === 构建工具 === proguardLib files('libs/proguard.jar') // === 测试框架 === testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' // === 开发工具 === developmentOnly 'org.springframework.boot:spring-boot-devtools' // === JnaFileChooser 库 === implementation 'com.github.steos.jnafilechooser:jnafilechooser-api:1.1.2' implementation 'com.github.steos.jnafilechooser:jnafilechooser-win32:1.1.2' // === Swing 组件 === implementation 'org.swinglabs:swingx:1.6.1' // === 本地库文件 === implementation files('libs/JNC-1.0-jnc.jar') implementation files('libs/dog api 1.3.jar') implementation files('libs/DesktopWallpaperSdk-1.0-SNAPSHOT.jar') // === DJL API === implementation platform('ai.djl:bom:0.35.0') implementation 'ai.djl:api' implementation 'ai.djl:model-zoo' implementation 'ai.djl.pytorch:pytorch-model-zoo:0.35.0' implementation 'ai.djl.pytorch:pytorch-engine' implementation 'ai.djl:basicdataset' implementation 'ai.djl.onnxruntime:onnxruntime-engine' runtimeOnly 'ai.djl.pytorch:pytorch-native-cpu:2.7.1' runtimeOnly 'ai.djl.onnxruntime:onnxruntime-native-cpu:1.3.0' // === 核心工具库 === implementation 'com.google.code.gson:gson:2.10.1' // 统一版本 implementation 'org.apache.logging.log4j:log4j-api:2.20.0' implementation 'org.apache.logging.log4j:log4j-core:2.20.0' implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0' implementation 'commons-io:commons-io:2.18.0' // 统一版本 implementation 'com.google.guava:guava:31.1-jre' implementation 'net.java.dev.jna:jna:5.13.0' implementation 'net.java.dev.jna:jna-platform:5.13.0' implementation 'org.apache.commons:commons-math3:3.6.1' implementation 'org.apache.commons:commons-compress:1.23.0' implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2' // === 字节码操作 === implementation 'org.ow2.asm:asm:9.7.1' implementation 'org.ow2.asm:asm-commons:9.7.1' implementation 'org.ow2.asm:asm-analysis:9.7.1' implementation 'org.ow2.asm:asm-util:9.7.1' implementation 'org.ow2.asm:asm-tree:9.7.1' implementation 'net.bytebuddy:byte-buddy:1.17.6' // === 反编译工具 === implementation 'org.bitbucket.mstrobel:procyon-core:0.6.0' // 统一版本 implementation 'org.bitbucket.mstrobel:procyon-compilertools:0.6.0' // 统一版本 implementation 'org.benf:cfr:0.152' // === Java 解析与分析 === implementation 'com.github.javaparser:javaparser-core:3.25.1' implementation 'com.github.javaparser:javaparser-symbol-solver-core:3.25.9' // === 文本处理 === implementation 'org.commonmark:commonmark:0.24.0' implementation 'org.commonjava.googlecode.markdown4j:markdown4j:2.2-cj-1.1' implementation 'com.vladsch.flexmark:flexmark:0.64.8' // === Web 和网络 === implementation 'org.jsoup:jsoup:1.17.2' implementation 'org.json:json:20231013' // 统一版本 implementation 'org.openjfx:javafx-web:17' // === UI 框架 === implementation 'com.formdev:flatlaf:3.2.1' implementation 'com.formdev:flatlaf-extras:3.2.1' implementation 'com.formdev:flatlaf-intellij-themes:3.2.1' implementation 'io.github.vincenzopalazzo:material-ui-swing:1.1.2' // JavaFX implementation 'org.openjfx:javafx-controls:21' implementation 'org.openjfx:javafx-graphics:21' implementation 'org.fxmisc.richtext:richtextfx:0.11.0' implementation 'org.controlsfx:controlsfx:11.1.2' implementation 'com.dlsc.formsfx:formsfx-core:11.6.0' implementation 'com.dustinredmond.fxtrayicon:FXTrayIcon:4.0.1' // === 代码编辑器 === implementation 'com.fifesoft:rsyntaxtextarea:3.5.4' implementation 'com.fifesoft:rstaui:3.3.1' implementation 'com.fifesoft:languagesupport:3.3.0' implementation 'com.fifesoft:autocomplete:3.3.2' // === 图形和游戏引擎 === // LWJGL implementation 'org.lwjgl:lwjgl:3.3.6' implementation 'org.lwjgl:lwjgl-stb:3.3.6' implementation 'org.lwjgl:lwjgl-glfw:3.3.6' implementation 'org.lwjgl:lwjgl-opengl:3.3.6' implementation 'org.lwjgl:lwjgl-jawt:3.3.5' // Lwjgl natives if (DefaultNativePlatform.currentOperatingSystem.isWindows()) { runtimeOnly 'org.lwjgl:lwjgl:3.3.6:natives-windows' runtimeOnly 'org.lwjgl:lwjgl-glfw:3.3.6:natives-windows' runtimeOnly 'org.lwjgl:lwjgl-opengl:3.3.6:natives-windows' runtimeOnly 'org.lwjgl:lwjgl-stb:3.3.6:natives-windows' } else if (DefaultNativePlatform.currentOperatingSystem.isLinux()) { runtimeOnly 'org.lwjgl:lwjgl:3.3.6:natives-linux' runtimeOnly 'org.lwjgl:lwjgl-glfw:3.3.6:natives-linux' runtimeOnly 'org.lwjgl:lwjgl-opengl:3.3.6:natives-linux' runtimeOnly 'org.lwjgl:lwjgl-stb:3.3.6:natives-linux' } else if (DefaultNativePlatform.currentOperatingSystem.isMacOsX()) { runtimeOnly 'org.lwjgl:lwjgl:3.3.6:natives-macos' runtimeOnly 'org.lwjgl:lwjgl-glfw:3.3.6:natives-macos' runtimeOnly 'org.lwjgl:lwjgl-opengl:3.3.6:natives-macos' runtimeOnly 'org.lwjgl:lwjgl-stb:3.3.6:natives-macos' } // 其他图形库 implementation 'com.badlogicgames.gdx:gdx:1.12.1' implementation 'org.joml:joml:1.10.7' implementation 'com.kitfox.svg:svg-salamander:1.0' implementation 'net.sourceforge.plantuml:plantuml:8059' implementation 'com.twelvemonkeys.imageio:imageio-psd:3.12.0' // === 图像处理 === implementation 'com.madgag:animated-gif-lib:1.4' implementation 'org.bytedeco:javacv-platform:1.5.7' implementation 'org.bytedeco:javacpp-platform:1.5.7' // === 编程语言支持 === implementation 'org.python:jython-standalone:2.7.3' implementation 'org.graalvm.python:python-embedding:24.2.1' // === 系统交互 === implementation 'com.github.kwhat:jnativehook:2.2.2' implementation 'com.1stleg:jnativehook:2.1.0' // === 数据库 === runtimeOnly 'com.mysql:mysql-connector-j' implementation 'mysql:mysql-connector-java:8.0.33' implementation 'com.h2database:h2:2.2.220' implementation 'org.xerial:sqlite-jdbc:3.41.2.1' implementation 'org.postgresql:postgresql:42.6.0' // === 音频处理 === implementation 'jflac:jflac:1.3' implementation 'com.github.axet:TarsosDSP:2.4' implementation 'com.googlecode.soundlibs:mp3spi:1.9.5-1' implementation 'com.googlecode.soundlibs:vorbisspi:1.0.3-2' implementation 'com.googlecode.soundlibs:jorbis:0.0.17-2' // === 语音识别 === implementation 'com.alphacephei:vosk:0.3.45' // === 浏览器引擎 === implementation 'me.friwi:jcefmaven:122.1.10' // === 中文处理 === implementation 'com.belerweb:pinyin4j:2.5.1' // === 安全认证 === implementation 'cn.dev33:sa-token-spring-boot-starter:1.44.0' implementation 'org.casbin:casdoor-java-sdk:1.37.0' } configurations.configureEach { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' } // 复制依赖到 libs 目录 task copyDependencies(type: Copy) { from configurations.runtimeClasspath into "$buildDir/libs/libs" } // 原始 jar 打包(不含依赖) tasks.jar { dependsOn copyDependencies archiveBaseName.set("${rootProject.name}") archiveVersion.set("${version}") } // ProGuard 混淆任务 task obfuscateJar(type: JavaExec) { dependsOn jar group = "build" description = "使用 ProGuard 混淆并生成映射表" mainClass = 'proguard.ProGuard' classpath = configurations.proguardLib args = [ '-injars', "$buildDir/libs/${rootProject.name}-${version}.jar", '-outjars', "$buildDir/libs/${rootProject.name}-${version}-obf.jar", '-libraryjars', "${System.getProperty('java.home')}/jmods/java.base.jmod", '-printmapping', "$buildDir/libs/output.srg", '-keep class com.axis.innovators.box.plugins.**', '-keep class com.axis.innovators.box.plugins.BoxClassLoader{*;}', '-keeppackagenames', 'com.axis.innovators.box', '-keeppackagenames', 'com.axis.innovators.box.plugins', '-keepnames', 'class com.axis.innovators.box.**', '-keepnames', 'class com.axis.innovators.box.plugins.**', '-dontwarn', '-dontoptimize', '-dontshrink', '-keepattributes', 'Signature,InnerClasses,EnclosingMethod,RuntimeVisibleAnnotations,RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotations,RuntimeInvisibleParameterAnnotations,Deprecated,SourceFile,LineNumberTable,LocalVariableTable,LocalVariableTypeTable' ] } build { dependsOn obfuscateJar } application { mainClass = 'com.axis.innovators.box.Main' } tasks.register('runBoxClient', JavaExec) { group = "run-toolboxProgram" description = "执行工具箱程序" classpath = sourceSets.main.runtimeClasspath mainClass = "com.axis.innovators.box.Main" jvmArgs = [ "-Dfile.encoding=UTF-8", "-Djava.system.class.loader=com.axis.innovators.box.plugins.BoxClassLoader" ] } tasks.register('runVivid2DClient', JavaExec) { group = "run-vivid2D" description = "执行工具箱程序" classpath = sourceSets.main.runtimeClasspath mainClass = "com.chuangzhou.vivid2D.Main" jvmArgs = [ "-Dfile.encoding=UTF-8" ] } tasks.register('test2DModelLayerPanel', JavaExec) { group = "test-model" description = "运行 2D Model Layer Panel 测试" classpath = sourceSets.main.runtimeClasspath mainClass = "com.chuangzhou.vivid2D.test.ModelLayerPanelTest" jvmArgs = [ "-Dfile.encoding=UTF-8" ] } tasks.register('testModelRenderLightingTest', JavaExec) { group = "test-model" description = "运行 2D Model 高亮灯光测试" classpath = sourceSets.main.runtimeClasspath mainClass = "com.chuangzhou.vivid2D.test.ModelRenderLightingTest" jvmArgs = [ "-Dfile.encoding=UTF-8" ] } tasks.register('testModelTest', JavaExec) { group = "test-model" description = "运行 2D Model 保存和完整性测试" classpath = sourceSets.main.runtimeClasspath mainClass = "com.chuangzhou.vivid2D.test.ModelTest" jvmArgs = [ "-Dfile.encoding=UTF-8" ] } tasks.register('testModelTest2', JavaExec) { group = "test-model" description = "运行 2D Model 物理基准测试" classpath = sourceSets.main.runtimeClasspath mainClass = "com.chuangzhou.vivid2D.test.ModelTest2" jvmArgs = [ "-Dfile.encoding=UTF-8" ] } task printFxPath { doLast { // 1. 获取所有运行时依赖文件 def runtimeClasspath = configurations.runtimeClasspath.files // 2. 筛选出所有名字包含 "javafx" 的 jar 包 def javafxJars = runtimeClasspath.findAll { file -> file.name.contains("javafx") } // 3. 获取这些 jar 包的绝对路径 def javafxPaths = javafxJars.collect { it.absolutePath } // 4. 使用系统的路径分隔符 (Windows是';', Linux/macOS是':') 将它们连接起来 def modulePath = javafxPaths.join(System.getProperty("path.separator")) println "========================================================================" println "COPY THIS JavaFX Module Path: " + modulePath println "========================================================================" } }