背景
公司要从erp拿数, 所以集成一下sapjco3进行连接. 初次集成在本地是没有问题的, 但是打包之后运行会出现
Caused by: java.lang.ExceptionInInitializerError: JCo initialization failed with java.lang.ExceptionInInitializerError: Illegal JCo archive “sapjco3-3.0.17.jar”. It is not allowed to rename or repackage the original archive “sapjco3.jar”.
这个问题是告诉我们不可以重命名这个jar包.
我查询了一下这个问题 原因是因为sap公司不允许进行sapjco3jar包的重命名或者重新打包,并且sap公司的某些客户场景遇到了问题,因此在sapjco3中添加了sapjco3的重命名检查,并将其硬编码到了jar包中, 也就是我们俗称的"写死了"
而我们在打包之后, maven会默认把version放在jar名的后面进行拼接. 所以造成了这个问题.
解决方案
1. 手动重命名
这个解决方案是有点朴实无华了, 但确实有效
你可以在打包过后的jar包中找到lib文件夹并把sapjco3-xxxx.jar重命名成sapjco3.jar或者sapjco3_IDE.jar. 然后保存. 这两个名字都可以解决问题
缺点就是: 你每次打完包都需要重命名, 以后交接文档什么的这一些都要写进去
2. 配置copy插件并指定该包进行stripVersion操作
在sap的官网论坛中我们可以看到, 还是有人不太满意这个手动改名的操作的. 因此他向sap官方提出了疑问
附: sap官网该帖地址
从官方的回答我们也不难看出, 还是有通过maven解决的办法的. 那就是
使用copy插件进行指定的jar包拷贝并在拷贝过程中剥离版本信息
我是maven多模块项目, 个人用这个无效(没用明白)
单项目可以用, 但是对于多模块项目…
我进行了copy的操作, 并保证了这个操作是在repackage操作之前的, 并且把copy操作挂载到了package生命周期, 但是在repackage后的jar包中, 我还是没有见到已经改名的jar包, 所以这个操作我就放弃了.
如果有想试一试的朋友, 我把查询的资料放在这里
https://www.one-tab.com/page/XqJDPdCzTkaRgpJCcE38og
上面放了我在查询过程中感觉可能有用的资料
3. 修改artifactId进行硬编码绕过
这个办法是我感觉目前可用的办法.
先来看一下内部校验

从上面的内部校验可以看到, sap进行了三个校验,分别是名称和前缀的校验
因此我们利用这个办法, 可以进行sap的artifactId改变, 将其前缀变成com.sap.conn.jco.sapjco3, 这样我们就可以绕过限制进行使用了
具体操作方法:
- 利用maven进行jar本地导入
mvn install:install-file -Dfile=地址/sapjco3.jar -DgroupId=com.sap.conn.jco -DartifactId=com.sap.conn.jco.sapjco3 -Dversion=3.0.17 -Dpackaging=jar- 引入pom依赖
- 改完收工
这里还是放一下参考资料:
https://github.com/hibersap/hibersap-sapjco3/issues/1
https://sourceforge.net/p/hibersap/discussion/813164/thread/52913577/#9818
https://hibersap.org/documentation/reference/#the-sap-java-connector-jco
放一下pom配置
到此为止 三个解决方案都已经齐活, 可以进行打包发布了
只不过在linux部署之后还会有其他的问题, 这里篇幅有限, 我写在下一篇吧…
转载请附地址
在Java项目中集成Sapjco3时,遇到打包后由于jar包名包含版本号导致初始化失败的问题。解决方案包括手动重命名jar包、配置maven copy插件剥离版本信息(对多模块项目无效)、修改artifactId以硬编码方式绕过校验。详细步骤和参考资料已提供。
16万+

被折叠的 条评论
为什么被折叠?



