JavaQuarkUS和提供的依赖项(sapjco3.jar)
我目前尝试将一个通过RFC连接到SAP系统的旧Java EE解决方案迁移到Quarkus。 由于项目使用maven,我再次面临sapjco3的问题。来自SAP的jar库,防止重命名该库。 如果我像那样添加库作为依赖项
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco3</artifactId>
<version>3.1</version>
</dependency>
它将以com的名称添加到lib目录中。液sapjco3-3.1。jar。 不幸的是,这最终导致了一场旷课
java.lang.ExceptionInInitializerError: JCo initialization failed with java.lang.ExceptionInInitializerError: Illegal JCo archive "com.sap.sapjco3-3.1.jar". It is not allowed to rename or repackage the original archive "sapjco3.jar".
已经有一些关于Stackoverflow的文章描述了这个问题,还有一篇SAP的说明:https://apps.support.sap.com/sap/support/knowledge/en/2182414
因此,我用“旧”方法解决了这个问题,将依赖项设置为provided,并使用maven依赖插件复制它
<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 initialization failed with java.lang.ExceptionInInitializerError: Illegal JCo archive "sapjco3-3.1.jar". It is not allowed to rename or repackage the original archive "sapjco3.jar".
如果我打包并尝试将其部署到docker容器中
mvn clean package
如果我将复制更改为pom中的另一个阶段,基本上可以将jar文件复制到lib目录。xml
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
但我首先得到构建警告:
[WARNING] [io.quarkus.arc.processor.BeanArchives] Failed to index com.sap.conn.jco.ext.DestinationDataProvider: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader
[INFO] [io.quarkus.arc.processor.IndexClassLookupUtils] Class for name: com.sap.conn.jco.ext.DestinationDataProvider was not found in Jandex index. Please ensure the class is part of the index.
随后出现以下错误:
java.lang.NoClassDefFoundError: com/sap/conn/jco/ext/DestinationDataProvider
Quarkus是否有解决方案来处理提供的依赖项并使用maven手动复制它们
# 1 楼答案
我们正在努力解决sapjco3的命名问题。直到我在这个链接上偶然发现一个脚注:https://help.mulesoft.com/s/article/It-is-not-allowed-to-rename-or-repackage-the-original-archive-sapjco3-jar
将工件命名为
com.sap.conn.jco.sapjco3.jar
,它将解决命名问题,因为即使添加了版本号,驱动程序也会接受这个名称不过,你的下一个绊脚石将是本地库。。。我没有在quarkus环境中解决这个问题的方法,因为我还没有尝试过
# 2 楼答案
我让SAP库在一个项目中与Quarkus合作。该解决方案并不特定于Quarkus(Spring Boot项目使用相同的解决方案)
首先,使用系统scome定义库,以便不修改其名称
然后,配置
maven-dependency-plugin
,在初始化阶段将库复制到此路径中,并将其包含在最终的包中。它还包含sapjco3使用的本机库的配置。jar库最后,根据配置文件配置应该包含的本机库,需要一个OS/CPU配置文件。以下是配置:
有了所有这些,test工作了,
mvn quarkus:dev
工作了,用mvn clean package
完成的包工作了请注意,默认情况下不会启动Maven的初始化阶段,需要调用
mvn initialize
一次库拷贝