【发布时间】:2021-03-08 05:51:57
【问题描述】:
我目前尝试将通过 RFC 连接到 SAP 系统的旧 Java EE 解决方案迁移到使用 Quarkus 的方法。 由于该项目使用 maven,我再次面临 SAP 的 sapjco3.jar 库的问题,该问题阻止了该库被重命名。 如果我像这样将库添加为依赖项
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco3</artifactId>
<version>3.1</version>
</dependency>
它将被添加到名为 com.sap.sapjco3-3.1.jar 的 lib 目录中。 不幸的是,这最终导致了异常
java.lang.ExceptionInInitializerError:JCo 初始化失败,出现 java.lang.ExceptionInInitializerError:非法 JCo 存档“com.sap.sapjco3-3.1.jar”。不允许重命名或重新打包原始存档“sapjco3.jar”。
Stackoverflow 上已经有一些文章描述了该问题,并且还有一个 SAP 说明:https://apps.support.sap.com/sap/support/knowledge/en/2182414
所以我用“旧”方法解决了这个问题,将依赖项设置为提供并使用 maven-dependency-plugin 复制它。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>process-resources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<includeArtifactIds>sapjco3</includeArtifactIds>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
不幸的是,这不适用于 quarkus。 如果我使用,正在开发中
mvn quarkus:dev
提供的似乎被忽略了,我仍然收到消息。
JCo 初始化失败,出现 java.lang.ExceptionInInitializerError:非法 JCo 存档“sapjco3-3.1.jar”。不允许重命名或重新打包原始存档“sapjco3.jar”。
如果我打包并尝试将其部署到 docker-container
mvn clean package
如果我将副本更改为 pom.xml 中的另一个阶段,它基本上可以将 jar 文件复制到 lib 目录
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
但我首先收到构建警告:
[警告] [io.quarkus.arc.processor.BeanArchives] 无法索引 com.sap.conn.jco.ext.DestinationDataProvider:ClassLoader 中不存在类 QuarkusClassLoader:部署类加载器
[INFO] [io.quarkus.arc.processor.IndexClassLookupUtils] 在 Jandex 索引中找不到名称的类:com.sap.conn.jco.ext.DestinationDataProvider。请确保该类是索引的一部分。
后来出现以下错误:
java.lang.NoClassDefFoundError: com/sap/conn/jco/ext/DestinationDataProvider
Quarkus 是否有解决方案来处理提供的依赖项并使用 maven 手动复制它们?
【问题讨论】:
标签: java maven quarkus sap-erp