如何将jce_policies8 jar添加到classpath并提交变更到Git
问题根因说明
你通过IntelliJ IDEA的「项目结构(Command+;)」入口添加类路径,修改的是IDEA本地的项目配置,这类配置默认存储在项目下的.idea目录中,而.idea目录几乎都会被配置到.gitignore规则里,所以git不会检测到变更,而且这种本地配置也无法同步到AWS Docker这类线上部署环境。
正确配置步骤
1. 本地jar托管到项目内
首先在你的Spring Boot项目根目录下新建一个专门存放第三方jar的目录,比如命名为lib,把你下载的两个JCE jar包(local_policy.jar、US_export_policy.jar)放到这个lib目录下。之后把这个目录提交到git,这样所有拉取代码的环境都能拿到这两个jar包。
2. 通过构建工具配置类路径,不要直接改IDE配置
这里分别给出Maven和Gradle的配置示例:
Maven配置
在你的pom.xml里添加本地依赖,指定system范围,路径指向刚才新建的lib目录:
<dependencies> <!-- JCE无限制权限策略依赖 --> <dependency> <groupId>com.oracle.jce</groupId> <artifactId>local_policy</artifactId> <version>1.8</version> <scope>system</scope> <systemPath>${project.basedir}/lib/local_policy.jar</systemPath> </dependency> <dependency> <groupId>com.oracle.jce</groupId> <artifactId>US_export_policy</artifactId> <version>1.8</version> <scope>system</scope> <systemPath>${project.basedir}/lib/US_export_policy.jar</systemPath> </dependency> <!-- 其他原有依赖 --> </dependencies>
如果你的Spring Boot打包要把这两个jar打到最终的可执行jar里,需要在spring-boot-maven-plugin配置里加上<includeSystemScope>true</includeSystemScope>:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin>
Gradle配置
在build.gradle里添加本地仓库指向lib目录,再引入依赖:
repositories { flatDir { dirs 'lib' } // 其他原有仓库 } dependencies { implementation name: 'local_policy' implementation name: 'US_export_policy' // 其他原有依赖 }
3. 适配Docker部署环境
你部署在AWS Docker容器,不需要额外改Dockerfile的classpath配置,只要你按上面的步骤配置了构建工具,打包出来的Spring Boot可执行jar已经自带了这两个依赖,直接正常构建镜像运行即可。如果你的Docker镜像是单独安装JDK运行jar包的,也可以选择把这两个jar包直接放到JDK的jre/lib/security目录下覆盖原有文件,这个方案也能解决问题,在Dockerfile里加对应COPY指令即可。
4. 提交变更到Git
做完上面的配置后,你需要提交以下文件到git:
- 整个
lib目录下的两个jar包 pom.xml(Maven项目)或者build.gradle(Gradle项目)- 如果修改了Dockerfile也需要一并提交
此时git可以正常检测到这些变更,因为这些文件都不在.gitignore的默认忽略规则里。
可选优化:如果你的JDK版本是Java 8 Update 161及以上,JCE无限制权限策略是默认开启的,直接升级Docker镜像内的JDK版本即可省去手动引入jar包的步骤。
内容的提问来源于stack exchange,提问作者Gokul E

