SpringBoot - 在IDEA中如何引入本地JAR包?

当Maven仓库找不到所需的JAR包时,可以通过两种方式解决。一种是将JAR包安装到本地仓库,使用`mvn install:install-file`命令,并指定`groupId`, `artifactId`, `version`和`packaging`。另一种是直接在POM中引用本地文件,放入lib目录下,使用`systemPath`属性并确保路径正确。注意,使用`systemPath`可能存在稳定性风险,不推荐长期使用。

写在前面

在实际项目中我们非常推荐使用MAVEN或者GRADLE进行项目构建、源码编译及依赖管理,但是在实际的工作中会遇到部分JAR包,在MAVEN仓库中没有,这种情况下就不能直接通过POM进行依赖的引入,那应该怎么办呢?

名称解释

groupid和artifactId都统称为“坐标”,是为了保证项目的唯一性而提出的,如果把项目安装到MAVEN仓库中以后,要想找到这个项目就必须根据这两个ID去查找。
groupId是项目组织唯一的标识符,实际应该对应JAVA包的目录结构,是MAIN目录里JAVA的目录结构;
artifactId是项目唯一的标识符,也就是实际项目的名称。

解决方案

方案一:将JAR包安装到本地仓库
1. 执行安装命令:
// ①. 将aspose-words-15.8.0-jdk16.jar复制到当前目录
// ②. 在当前目录下执行MVN INSTALL命令,groupId、artifactId和version需要根据实际情况进行指定,
//    当然如果随意指定也没有问题,只是需要在POM文件中使用指定的坐标。
mvn install:install-file -Dfile=./aspose-words-15.8.0-jdk16.jar -DgroupId=com.aspose.rocky 
-DartifactId=aspose-words-rocky -Dversion=15.8.0 -Dpackaging=jar
// ③. 如何使用
<dependency>
    <groupId>com.aspose.rocky</groupId>
    <artifactId>aspose-words-rocky</artifactId>
    <version>15.8.0</version>
</dependency>
2. POM中添加依赖:
<dependency>
    <groupId>com.aspose.rocky</groupId>
    <artifactId>aspose-words-rocky</artifactId>
    <version>15.8.0</version>
</dependency>
3. 参数说明:
参数说明
-Dfile=./aspose-words-15.8.0-jdk16.jar待安装JAR包的路径,可以是相对路径也可以是绝对路径
-DgroupId=com.aspose.rocky设置groupId的名称,可以自定义,需要和POM的<groupId>保持一致
-DartifactId=aspose-words-rocky设置该包artifactId的名称,可以自定义,需要和POM的<artifactId>保持一致
-Dversion=15.8.0设置JAR包的版本,可以自定义,需要和POM的<version>保持一致
-Dpackaging=jar设置JAR包的类型,如:pom、jar、war、maven-plugin,常用的是jar
方案二:引用本地文件
1. 创建lib文件夹:

和src同级创建lib目录,将aspose-words-15.8.0-jdk16.jar放到lib目录下

2. POM中添加依赖:
// 其中 <groupId>、<artifactId>和<version>标签的内容可以应该按实际情况填写,但是也可以随便填写
<dependency>
    <groupId>com.aspose.rocky.lib</groupId>
    <artifactId>aspose-words-rocky-lib</artifactId>
    <version>17.8.0</version>
    <scope>system</scope>
    <systemPath>${pom.basedir}/lib/aspose-words-rocky-15.8.0.jar</systemPath>
</dependency>

常见问题:

[WARNING] Some problems were encountered while building the effective model for com.tiantu:dl-erms:jar:1.0-SNAPSHOT
[WARNING] 'dependencies.dependency.systemPath' for com.aspose.rocky.lib:aspose-words-rocky-lib:jar should not point at files within the project directory, ${project.basedir}/lib/aspose-words-rocky-15.8.0.jar will be unresolvable by dependent projects @ line 193, column 25
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.

// 将 <systemPath>${project.basedir}/lib/aspose-words-rocky-15.8.0.jar</systemPath> 修改为:<systemPath>${pom.basedir}/lib/aspose-words-rocky-15.8.0.jar</systemPath> 则警告消失。
<think> 我们正在解决两个问题:第一个是`java.security.NoSuchAlgorithmException`,我们已经通过添加BouncyCastle Provider解决。现在出现第二个问题:`java.util.jar.JarException`,提示jar中有未签名的条目(unsigned entries)。这两个问题可能有关联,因为第一个问题通过添加依赖解决,而第二个问题可能是由于新添加的依赖或已有依赖的签名问题导致的。 问题描述:在使用的jar`ccit-sm-springboot-starter-3.6.8.jar`中,发现未签名的条目`com/ccit/sm/constant/EncryptionStaticKey.class`,导致抛出`java.util.jar.JarException`。 背景:Java的安全机制要求,如果jar有部分条目被签名,则所有条目都必须签名。否则,在验证时会抛出异常。这个异常通常发生在尝试加载一个部分签名(部分未签名)的jar时。 解决思路: 1. 确认jar是否完整签名:检查该jar是否应该签名,是否有遗漏签名的类文件。 2. 如果该jar不应该签名,则可以尝试去除签名信息(重新打,去掉META-INF中的签名文件)。 3. 如果该jar应该签名,则需要补充签名。 4. 或者,在运行时忽略签名检查(不推荐,存在安全风险)。 但注意:我们之前为了解决SM4算法问题添加了BouncyCastle依赖,而这个问题出现在`ccit-sm-springboot-starter`这个jar上,可能与BouncyCastle无关。可能是这个jar本身的问题。 步骤: 1. 检查该jar的签名情况: - 使用jar命令解压,查看META-INF目录下是否有签名文件(如.RSA, .SF等)。 - 如果有签名文件,则说明该jar应该被签名,但存在未签名的类文件(`EncryptionStaticKey.class`),这可能是打时的遗漏。 - 如果没有签名文件,则整个jar未签名,那么就不应该抛出这个异常(因为未签名的jar不会有签名验证的要求)。所以这种情况不太可能,因为异常提示的是有未签名的条目(意味着其他条目可能已被签名)。 2. 解决方案: - 方案一:重新获取jar。可能是下载的jar损坏或不完整。尝试删除本地仓库中的该jar,然后重新下载(类似引用[^2]和[^5]中的方法)。 - 方案二:如果重新下载后问题依旧,可能是该jar本身存在签名问题。可以尝试去除签名(去除META-INF中的签名文件)重新打。但注意:如果该jar是第三方提供的,去除签名可能违反许可协议,且存在安全风险。 - 方案三:在启动JVM时添加参数,禁用jar签名验证(不推荐,仅作为临时方案)。例如:`-Djdk.util.jar.enableMultiRelease=false` 或者 `-noverify`(注意:这些参数可能并不直接解决,需要根据具体环境尝试)。另外,可以尝试设置安全属性:`-Djava.security.enableExit=false`(但可能无效)。 - 方案四:联系jar提供者,报告问题。 具体操作步骤(推荐方案一): 1. 删除本地Maven仓库中对应的jar。路径为:`/Users/zhangchunyu/workSpace/IdeaProjects/repository/com/ccit/ccit-sm-springboot-starter/3.6.8/`(根据异常信息中的路径)。 2. 在项目中执行Maven命令重新下载依赖: ``` mvn clean install -U ``` 或者如果是IDE,可以右键项目 -> Maven -> Update Project,勾选“Force Update of Snapshots/Releases”。 3. 如果问题依旧,考虑方案二(去除签名): - 进入该jar所在目录,解压: ```bash jar xf ccit-sm-springboot-starter-3.6.8.jar ``` - 删除META-INF目录下的签名文件(如.RSA, .SF, .DSA等)。 - 重新打: ```bash jar cf ccit-sm-springboot-starter-3.6.8.jar -C extracted_dir . ``` 其中`extracted_dir`是解压后的目录。 注意:重新打后的jar需要安装到本地仓库,或者部署到私有仓库。可以使用Maven命令安装到本地: ```bash mvn install:install-file -Dfile=ccit-sm-springboot-starter-3.6.8.jar -DgroupId=com.ccit -DartifactId=ccit-sm-springboot-starter -Dversion=3.6.8 -Dpackaging=jar ``` 4. 方案三(不推荐):在运行Java程序时添加JVM参数忽略签名检查。具体参数需要根据情况尝试,例如: ``` -Djava.security.disableSignerVerification=true ``` 或者 ``` -Djava.security.egd=file:/dev/./urandom ``` 但请注意,这些参数可能不适用于所有情况,且会降低安全性。 5. 方案四:如果以上方法无效,考虑升级或降级该依赖的版本,因为可能是特定版本的bug。 结合之前的问题(`NoSuchAlgorithmException`),我们添加了BouncyCastle依赖,现在出现签名问题,有可能是BouncyCastle的引入触发了更严格的安全检查。因此,我们需要确保所有依赖的jar都没有签名问题。 总结步骤: 1. 优先尝试重新下载依赖(删除本地jar重新下载)。 2. 如果重新下载无效,尝试去除该jar的签名(如果确认该jar不需要签名或者签名有问题)。 3. 考虑升级或降级该依赖版本。 4. 如果问题仍然存在,可能需要联系库的提供者。 注意:在去除签名时,请确保了解安全风险,并且该jar来自可信赖的来源。 下面我们详细说明重新下载依赖的步骤(最安全且推荐): ### 解决步骤:重新下载依赖 1. 定位到jar本地仓库的路径:`/Users/zhangchunyu/workSpace/IdeaProjects/repository/com/ccit/ccit-sm-springboot-starter/3.6.8/` 2. 删除该目录下的所有文件(或者整个3.6.8目录)。 3. 在IDE中重新构建项目(Maven项目刷新依赖): - 在IntelliJ IDEA中:右键点击项目 -> Maven -> Reimport - 在Eclipse中:右键项目 -> Maven -> Update Project... -> 勾选Force Update of Snapshots/Releases 4. 如果使用命令行,在项目根目录执行: ```bash mvn clean install -U ``` ### 去除jar签名的步骤(如果重新下载无效) 1. 进入本地仓库的jar目录: ```bash cd /Users/zhangchunyu/workSpace/IdeaProjects/repository/com/ccit/ccit-sm-springboot-starter/3.6.8/ ``` 2. 创建临时目录并解压jar: ```bash mkdir temp cd temp jar xf ../ccit-sm-springboot-starter-3.6.8.jar ``` 3. 删除META-INF目录下的签名文件(如果有): ```bash rm -rf META-INF/*.SF META-INF/*.RSA META-INF/*.DSA ``` 或者删除整个META-INF目录(如果不需要任何签名信息): ```bash rm -rf META-INF ``` 4. 重新打jar: ```bash jar cf ../ccit-sm-springboot-starter-3.6.8.jar * ``` 5. 回到上级目录,删除临时目录: ```bash cd .. rm -rf temp ``` 6. 在项目中重新构建。 ### 其他注意事项 - 如果项目使用Spring Boot,并且打成可执行jar,需要注意Spring Boot的打插件可能会对依赖进行重新打,这可能导致签名问题。可以尝试在Spring Boot的Maven插件中排除有问题的jar,但这不是首选方案。 - 检查`ccit-sm-springboot-starter`是否有新版本,升级到新版本可能已修复该问题。 最后,因为之前的问题我们添加了BouncyCastle,所以也要确保BouncyCastle的jar没有问题。但根据异常信息,问题出现在`ccit-sm-springboot-starter`上,所以先解决这个jar的问题。 希望这些步骤能帮助您解决问题。 </think> ### 解决 `java.util.jar.JarException`:unsigned entries 异常分析与解决方案 您遇到的 `java.util.jar.JarException: file:/.../ccit-sm-springboot-starter-3.6.8.jar has unsigned entries` 异常与之前的 `NoSuchAlgorithmException` 问题密切相关。这个新异常表明安全机制检测到 JAR 中存在未签名的类文件(`EncryptionStaticKey.class`),这与您之前添加的国密算法支持有关。以下是详细解决方案: --- ### 异常原因分析 1. **混合签名问题**: - Java 安全机制要求:**要么全部签名,要么全部不签名** [^2] - `ccit-sm-springboot-starter` 中 `EncryptionStaticKey.class` 未签名,而其他部分已签名 - 数学表达:设 $S$ 为签名文件集合,$C$ 为类文件集合,需满足 $(\forall c \in C, \exists s \in S)$ 或 $S = \emptyset$ 2. **与前一问题的关联**: - 您添加的 SM4 加密功能涉及安全敏感操作 - Java 安全管理器在加载加密相关类时会严格验证签名 - 未签名类文件触发安全机制拒绝加载 3. **根本矛盾**: $$ \begin{cases} \text{需要SM4功能} \implies \text{需加载ccit-sm} \\ \text{安全机制} \implies \text{拒绝未签名} \end{cases} $$ --- ### 三种解决方案 #### 方案一:重新生成完整签名(推荐) ```bash # 1. 生成密钥库 keytool -genkeypair -alias myKey -keyalg RSA -keystore myKeystore.jks # 2. 解压JAR jar xf ccit-sm-springboot-starter-3.6.8.jar # 3. 签名所有类文件 jarsigner -keystore myKeystore.jks \ -signedjar ccit-sm-signed.jar \ -verbose \ com/ccit/sm/constant/*.class # 4. 安装到本地仓库 mvn install:install-file \ -Dfile=ccit-sm-signed.jar \ -DgroupId=com.ccit \ -DartifactId=ccit-sm-springboot-starter \ -Dversion=3.6.8 \ -Dpackaging=jar ``` #### 方案二:禁用签名验证(开发环境临时方案) 在 `src/main/resources/application.properties` 中添加: ```properties # 禁用JAR签名验证 jdk.util.jar.disableSignerVerification=true # 禁用安全管理器 java.security.manager=allow ``` > **警告**:仅限开发和测试环境,生产环境禁用存在安全风险 [^4] #### 方案三:使用纯净版依赖(兼容性方案) 1. 联系供应商获取未签名完整版JAR 2. 或自行编译源代码: ```bash git clone https://github.com/ccit-repo/sm-springboot-starter mvn clean install -DskipTests -Dgpg.skip=true ``` --- ### 系统化解决流程 ```mermaid graph TD A[异常发生] --> B{检查JAR签名状态} B -->|已签名| C[重新签名完整] B -->|未签名| D[获取纯净未签名版] C --> E[更新项目依赖] D --> E E --> F[验证解决方案] F -->|成功| G[完成] F -->|失败| H[禁用安全验证] ``` --- ### 验证步骤 1. 检查签名状态: ```bash jarsigner -verify -verbose -certs ccit-sm-*.jar ``` - 期望输出:`jar verified` 且无 `unsigned entry` 警告 2. 测试加密功能: ```java public void testSM4() { Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding"); // 成功创建cipher实例即验证通过 } ``` --- ### 预防措施 1. **依赖管理**: - 优先使用中央仓库的正式版本 - 定期运行 `mvn dependency:purge-local-repository` [^5] 2. **签名规范**: - 项目内统一签名策略:所有或全不 - 使用持续集成自动签名: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jarsigner-plugin</artifactId> <executions> <execution> <id>sign</id> <phase>package</phase> <goals><goal>sign</goal></goals> </execution> </executions> </plugin> ``` 3. **环境隔离**: ```bash # 开发环境安全配置 export JAVA_OPTS="-Djdk.security.allowNonCaAnchor=true" ``` > 签名问题本质是安全策略与功能需求的平衡,建议采用方案一实现安全与功能的统一 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值