我目前尝试将一个通过rfc连接到sap系统的旧JavaEE解决方案迁移到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
所以我用“旧”方法解决了这个问题,将依赖项设置为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初始化失败,java.lang.exceptionininitializererror:非法jco存档“sapjco3-3.1.jar”。不允许重命名或重新打包原始存档“sapjco3.jar”。
如果我将它打包并尝试将其部署到docker容器中
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失败:类加载器quarkuscl中不存在类assloader:deployment class 装载机
在jandex索引中找不到名称为com.sap.conn.jco.ext.destinationdataprovider的[info][io.quarkus.arc.processor.indexclasslookuputils]类。请确保该类是索引的一部分。
然后出现以下错误:
java.lang.noclassdeffounderror:com/sap/conn/jco/ext/destinationdataprovider
quarkus是否有解决方案来处理提供的依赖项并用maven手动复制它们?
1条答案
按热度按时间n3schb8v1#
我有sap库在一个项目中与quarkus合作。该解决方案并不特定于quarkus(spring引导项目使用相同的解决方案)。
首先,使用系统scome定义库,以便不修改其名称。
然后,配置
maven-dependency-plugin
在初始化阶段复制此路径中的库并将其包含在最终包中。它还包含sapjco3.jar库使用的本机lib的配置。最后,根据配置文件配置应该包括哪些本机lib,需要一个os/cpu架构的配置文件。配置如下:
有了这些,测试工作,
mvn quarkus:dev
工作,和一个包完成了mvn clean package
作品。注意maven的初始化阶段在默认情况下不是启动的,您需要调用
mvn initialize
只有一次图书馆拷贝发生了。