如何移除依赖JAR包中的签名?适配Maven WebStart转Tomcat组件场景
解决WebStart签名JAR在Tomcat WAR组件中复用的问题
我完全懂这种被遗留约束绑住的感觉——不用纠结设计合理性,咱们直接搞定实际问题。针对你要把foo项目的部分模块用到bar这个Tomcat WAR组件里的需求,给你几个可行的方案:
优先方案:拆分共用模块
把foo里需要给bar复用的代码单独抽成一个独立的Maven模块(比如叫foo-shared),这样:- foo的WebStart项目可以依赖这个模块,正常用
maven-jarsigner-plugin签名整个WebStart包; - bar的WAR项目直接依赖这个未签名的共用模块,打包时自然就把代码包含进去,完全避开签名相关的麻烦。
这是最干净的做法,也能避免后续维护的坑。
- foo的WebStart项目可以依赖这个模块,正常用
如果必须用已签名的JAR
要是没法拆分模块,只能直接用foo的签名JAR,得处理两个关键点:排除WebStart特定内容
签名的WebStart JAR里会有JNLP-INF目录和签名文件(.SF、.DSA、.RSA),这些对Tomcat来说没用,甚至可能导致加载异常。你可以在bar的Maven项目里用maven-dependency-plugin解压并排除这些内容:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack-foo-signed-jar</id> <phase>process-resources</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>你的项目groupId</groupId> <artifactId>foo</artifactId> <version>对应版本号</version> <type>jar</type> <outputDirectory>${project.build.directory}/classes</outputDirectory> <excludes>JNLP-INF/**,META-INF/*.SF,META-INF/*.DSA,META-INF/*.RSA</excludes> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin>这样处理后,打包进WAR的就只有实际需要的代码,不会带签名和WebStart相关的冗余内容。
处理Tomcat的权限问题
如果你的场景必须保留签名文件,那得确保Tomcat允许加载这个签名JAR。可以修改Tomcat的catalina.policy文件,添加对应的权限配置:grant codeBase "file:${catalina.base}/webapps/bar/WEB-INF/lib/foo.jar" { // 根据实际需求调整权限,别直接用AllPermission permission java.security.AllPermission; };注意:尽量不要用
AllPermission,根据代码实际需要的权限来配置,避免安全风险。
依赖管理注意事项
不管用哪种方案,确保bar项目能正确拉取到foo的模块/ JAR:- 如果是本地多模块项目,直接在bar的
pom.xml里添加模块依赖; - 如果foo已经发布到Maven仓库,直接添加对应的
<dependency>节点即可,依赖范围用compile,这样会自动打包进WAR的WEB-INF/lib目录。
- 如果是本地多模块项目,直接在bar的
内容的提问来源于stack exchange,提问作者amphibient
相关产品推荐
相关产品推荐

