diff --git a/build.gradle b/build.gradle index 5c47a86..99f6fb4 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,7 @@ buildscript { } plugins { + id 'com.github.johnrengelman.shadow' version '8.1.1' id 'java' id 'io.franzbecker.gradle-lombok' version '3.0.0' id 'application' @@ -65,14 +66,24 @@ dependencies { implementation 'ch.qos.logback:logback-classic:1.5.18' implementation 'ch.qos.logback:logback-core:1.5.18' - implementation 'ch.qos.logback:logback-classic:1.5.6' + implementation 'commons-cli:commons-cli:1.9.0' implementation 'com.alibaba:easyexcel:4.0.3' implementation 'org.apache.pdfbox:pdfbox:3.0.5' implementation 'com.github.albfernandez:javadbf:1.14.1' implementation 'org.apache.poi:poi-ooxml:5.4.1' implementation 'com.intellij:annotations:12.0' + + // ofdrw 核心库 + implementation 'org.ofdrw:ofdrw-core:2.3.7' + implementation 'org.ofdrw:ofdrw-pkg:2.3.7' implementation 'org.ofdrw:ofdrw-reader:2.3.7' + + // 第三方依赖 + implementation 'dom4j:dom4j:1.6.1' + implementation 'org.bouncycastle:bcpkix-jdk18on:1.77' // 注意:版本可能需要调整 + implementation 'commons-io:commons-io:2.11.0' + compileOnly 'org.projectlombok:lombok:1.18.38' annotationProcessor 'org.projectlombok:lombok:1.18.38' @@ -83,10 +94,35 @@ dependencies { testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion" } +// ... application 块 ... application { // 取消模块化,去掉 mainModule mainClass = 'top.r3944realms.docchecktoolrefactored.Main' } +// 配置 Shadow-JAR 任务 第三方依赖的签名文件(.SF、.RSA)在 Fat-JAR 中冲突,导致 JVM 验证失败 +shadowJar { + // 设置生成的 Jar 包名称 + archiveBaseName.set(project_name) + archiveVersion.set(project_version) + + // 指定主类,这样可以直接用 java -jar 运行 + manifest { + attributes 'Main-Class': application.mainClass.get() + } + + // 合并服务文件(例如 SPI 配置),对某些库很重要 + mergeServiceFiles() + + // 核心修复:排除所有签名文件,解决 "Invalid signature file digest" 错误 + exclude 'META-INF/*.SF' + exclude 'META-INF/*.RSA' + exclude 'META-INF/*.DSA' +} + +// 让 build 任务依赖 shadowJar,这样执行 ./gradlew build 时也会生成 Fat-JAR +build.dependsOn shadowJar + + javafx { version = javafxVersion @@ -131,26 +167,7 @@ tasks.register('runCli', JavaExec) { } } -// 可选:创建生成可执行JAR的任务 -tasks.register('buildFatJar', Jar) { - group = 'build' - description = 'Builds a standalone JAR with all dependencies' - manifest { - attributes( - 'Main-Class': 'top.r3944realms.docchecktoolrefactored.Main' - ) - } - - from { - configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } - } - with jar // 继承主 jar 的内容 - - archiveBaseName.set(project_name) - archiveVersion.set(project_version) - duplicatesStrategy = DuplicatesStrategy.EXCLUDE -} // =================== 轻便版打包 =================== @@ -158,14 +175,24 @@ tasks.register('buildPortable', Exec) { group = 'distribution' description = 'Build portable EXE (no installer)' - dependsOn buildFatJar + // 依赖 shadowJar 任务,而不是 buildFatJar + dependsOn shadowJar + + doFirst { + mkdir "$buildDir/distributions" + + // 打印出生成的 shadow JAR 信息,方便确认 + def shadowJarFile = shadowJar.archiveFile.get().asFile + println "Using shadow JAR for packaging: ${shadowJarFile.name}" + println "Location: ${shadowJarFile.parent}" + } commandLine 'jpackage', - '--name', 'DocCheckTool', - '--input', "$buildDir/libs", - '--main-jar', "${project_name}-${project_version}.jar", + '--name', project_name, // 使用 project_name 属性 + '--input', shadowJar.archiveFile.get().asFile.parent, // shadow JAR 所在的目录 + '--main-jar', shadowJar.archiveFileName.get(), // shadow JAR 的文件名 '--main-class', application.mainClass.get(), - '--type', 'app-image', // ⚠️ 轻便版不生成安装器 + '--type', 'app-image', '--app-version', project_version, '--vendor', 'r3944realms', '--dest', "$buildDir/distributions", @@ -174,8 +201,9 @@ tasks.register('buildPortable', Exec) { '--java-options', '-Xms256m', '--verbose', '--icon', file('src/main/resources/img/logo256x.ico').absolutePath +} + + + + - doFirst { - mkdir "$buildDir/distributions" - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 82c2d2c..de312de 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ project_group =top.r3944realms.docchecktoolrefacored project_name = doc-check-tool -project_version = 1.0.0.5 \ No newline at end of file +project_version = 1.0 \ No newline at end of file diff --git a/src/main/java/top/r3944realms/docchecktoolrefactored/io/reader/ExcelFileReader.java b/src/main/java/top/r3944realms/docchecktoolrefactored/io/reader/ExcelFileReader.java index 32503fa..a0c01a1 100644 --- a/src/main/java/top/r3944realms/docchecktoolrefactored/io/reader/ExcelFileReader.java +++ b/src/main/java/top/r3944realms/docchecktoolrefactored/io/reader/ExcelFileReader.java @@ -108,12 +108,12 @@ public class ExcelFileReader implements CatalogFileReader { // 验证数据有效性 if (archiveCode.isEmpty()) { - DialogUtil.showWarningDialog("警告", "操作有误", "第" + ( i + 1 ) + "行档号为空,停止处理"); + throw new IllegalArgumentException("第" + ( i + 1 ) + "行档号为空,停止处理"); } if (page <= 0) { - DialogUtil.showWarningDialog("警告", "操作有误", "第" + ( i + 1 ) + "第" + ( i + 1 ) + "行页数无效: " + page + ",停止处理"); + throw new IllegalArgumentException("第" + ( i + 1 ) + "行页数无效: " + page + ",停止处理"); } diff --git a/src/main/java/top/r3944realms/docchecktoolrefactored/ui/MainStageController.java b/src/main/java/top/r3944realms/docchecktoolrefactored/ui/MainStageController.java index 2a8c893..1c40110 100644 --- a/src/main/java/top/r3944realms/docchecktoolrefactored/ui/MainStageController.java +++ b/src/main/java/top/r3944realms/docchecktoolrefactored/ui/MainStageController.java @@ -212,9 +212,9 @@ public class MainStageController { } // 帮助文档在资源中的路径 - private static final String HELP_DOC_RESOURCE_PATH = "/docs/UserHelpDocument.docx"; + private static final String HELP_DOC_RESOURCE_PATH = "/docs/UserHelpDocument.pdf"; // 释放到外部的文件名 - private static final String HELP_DOC_FILE_NAME = "操作手册.docx"; + private static final String HELP_DOC_FILE_NAME = "用户使用说明书.pdf"; /** * 使用系统默认程序打开文档 diff --git a/src/main/java/top/r3944realms/docchecktoolrefactored/ui/task/AddressFileGenerationTask.java b/src/main/java/top/r3944realms/docchecktoolrefactored/ui/task/AddressFileGenerationTask.java index 5af1b00..b830b0b 100644 --- a/src/main/java/top/r3944realms/docchecktoolrefactored/ui/task/AddressFileGenerationTask.java +++ b/src/main/java/top/r3944realms/docchecktoolrefactored/ui/task/AddressFileGenerationTask.java @@ -84,7 +84,7 @@ public class AddressFileGenerationTask extends Task { outputFile.delete();// 删除空内容的csv文件 throw e; // 直接抛出,保留原始消息 } - throw new RuntimeException("地址文件生成失败", e); + throw e; } }); diff --git a/src/main/resources/docs/UserHelpDocument.docx b/src/main/resources/docs/UserHelpDocument.docx deleted file mode 100644 index 48b11c9..0000000 Binary files a/src/main/resources/docs/UserHelpDocument.docx and /dev/null differ diff --git a/src/main/resources/docs/UserHelpDocument.pdf b/src/main/resources/docs/UserHelpDocument.pdf new file mode 100644 index 0000000..7d7b105 Binary files /dev/null and b/src/main/resources/docs/UserHelpDocument.pdf differ diff --git a/用户使用说明书.pdf b/用户使用说明书.pdf new file mode 100644 index 0000000..7d7b105 Binary files /dev/null and b/用户使用说明书.pdf differ