Sap Jco 3.0.11 with Maven:不允许重命名或重新打包原始档案" sapjco3.jar"

时间:2014-07-15 18:11:06

标签: java maven sap

当前版本的sap jco连接器在运行时强制包含jar的名称。如果它与名称(sapjco3.jar)不匹配,则会导致异常。

JCo初始化失败,出现java.lang.ExceptionInInitializerError:非法JCo 存档“sap-jco-win-amd-64-3.0.11.jar”。不允许重命名或重新打包原始档案“sapjco3.jar”

我们将这些库包装起来,并在我们的nexus存储库中使用自定义pom进行部署。标准maven构建是无法使用的atm,这是由于此更改/标准maven方式命名工件。

当前的解决方法使用系统范围来实现此依赖关系,并将sapjco maven工件复制到项目中的指定文件夹,因为这是强制执行jar文件名称并将其作为依赖项保留在构建中的唯一方法。这适用于同一模块。系统范围的一个缺点是传递伪像的停用/失败分辨率。我们需要这样,因为sap连接器模块包含在应用程序war模块中。由于系统范围依赖关系未包含在打包的工件中,我们必须将它们复制到web-inf / lib文件夹并向清单添加类路径条目。

当我从父/根模块启动它时,构建工作,但由于系统范围依赖性而在子模块中启动它时失败。我们现在可以忍受这个解决方案,但我绝对不满意。

是否有推荐的方法将sapjco与maven或更简单的方法一起使用来生成平台相关的工件,包括本机库和具有指定名称的jar? SAP是否重新考虑此检查,因为以前的版本没有包括它?

编辑:

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,下面是如何解决它(总之解决): 1.在命令提示符下运行命令

mvn install:install-file 
-Dfile=sapjco3.jar 
-DgroupId=com.company.sap 
-DartifactId=com.sap.conn.jco.sapjco 
-Dversion=1.0 
-Dpackaging=jar
  1. 这将创建一个本地工件,或者您也可以在远程存储库中创建它
  2. 从maven下载此依赖项,如下所示:

    <dependency> <groupId>com.company.sap</groupId> <artifactId>com.sap.conn.jco.sapjco</artifactId> <version>1.0</version> </dependency>

此替代方法可以避免sapjco3错误:

if (!jarname.equals("sapjco3.jar") 
&& !jarname.startsWith("com.sap.conn.jco") 
&& !jarname.equals("sapjco3_IDE.jar") 
&& Package.getPackage("org.apache.maven.surefire.booter") == null 
&& Package.getPackage("org.eclipse.jdt.internal.junit.runner") == null) {
    throw new ExceptionInInitializerError("Illegal JCo archive \"" + jarname + "\". It is not allowed to rename or repackage the original archive \"" + "sapjco3.jar" + "\".");
}