目前,我试图迁移一个旧的Java解决方案,该解决方案通过RFC连接到SAP系统,并与Quarkus进行连接。由于该项目使用maven,我再次面临SAP中的皂荚3.jar库的问题,这个问题阻止了这个库的重命名。如果我像这样将库作为依赖项添加
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco3</artifactId>
<version>3.1</version>
</dependency>
它将被添加到lib目录中,名称为com.皂苷.皂荚3-3.1.jar。不幸的是,这最终导致了一场过度。
java.lang.ExceptionInInitializerError: JCo初始化失败,java.lang.ExceptionInInitializerError:非法的JCo归档文件“com.皂甙3-3.1.jar”。它不允许重命名或重新打包原始存档“subjco3.jar”。
已经有一些关于堆栈溢出的文章描述了这个问题,还有一个SAP-注意:https://apps.support.sap.com/sap/support/knowledge/en/2182414。
因此,我用“旧”方法解决了这个问题,将依赖设置为提供,并将其复制到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>
不幸的是,这并不适用于夸克。在开发中,如果我使用
mvn quarkus:dev
提供的信息似乎被忽略了,我仍然得到了信息。
JCo初始化失败与java.lang.ExceptionInInitializerError:非法的JCo存档“皂荚3-3.1.jar”。它不允许重命名或重新打包原始存档“subjco3.jar”。
如果我将它打包并尝试将它部署到一个码头容器中
mvn clean package
如果我将jar文件复制到pom.xml的另一个阶段,它基本上可以将jar文件复制到lib目录。
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
但我首先收到了构建警告:
警告未能索引com.sap.conn.jco.ext.DestinationDataProvider: ClassLoader QuarkusClassLoader:Deployment名称: com.sap.conn.jco.ext.DestinationDataProvider在ClassLoader索引中不存在。请确保课程是索引的一部分。
然后发生以下错误:
java.lang.NoClassDefFoundError: com/sap/conn/jco/ext/DestinationDataProvider
是否有使用Quarkus的解决方案来处理所提供的依赖关系并用maven手动复制它们?
发布于 2020-11-25 04:06:03
我让SAP库在一个项目中与Quarkus一起工作。该解决方案不特定于Quarkus ( Spring项目使用相同的解决方案)。
首先,使用system定义库,这样它的名称就不会被修改。
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco3</artifactId>
<version>3.1</version>
<scope>system</scope>
<systemPath>${project.build.directory}/dependency/sapjco3.jar</systemPath>
</dependency>
然后,将maven-dependency-plugin
配置为在初始化阶段在此路径中复制库,并将其包含在最终包中。它还包含由皂荚3.jar库使用的本机库的配置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-jco-libs-unit-tests</id>
<phase>initialize</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<stripVersion>true</stripVersion>
<outputDirectory>${lib.directory}</outputDirectory>
<artifactItems>
<artifactItem>
<groupId>com.sap.conn.jco</groupId>
<artifactId>sapjco3</artifactId>
<version>${sap.jco.version}</version>
<overWrite>true</overWrite>
<destFileName>sapjco3.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
<execution>
<id>copy-native-lib-for-unit-tests</id>
<phase>process-sources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<stripVersion>true</stripVersion>
<outputDirectory>${native.lib.directory}</outputDirectory>
<artifactItems>
<artifactItem>
<groupId>com.sap.conn.jco</groupId>
<artifactId>sapjco3</artifactId>
<version>${sap.jco.version}</version>
<type>${envType}</type>
<classifier>${envClassifier}</classifier>
<overWrite>true</overWrite>
<destFileName>${native.lib.filename}.${envType}</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
最后,配置配置文件应该包含哪些本机库,需要一个OS/CPU arch配置文件。以下是配置:
<profiles>
<!-- Manage JCO native deps by OS arch -->
<profile>
<id>windows-x86_64</id>
<activation>
<os>
<family>windows</family>
<arch>x86_64</arch>
</os>
</activation>
<properties>
<envClassifier>ntamd64</envClassifier>
<envType>dll</envType>
<native.lib.filename>sapjco3</native.lib.filename>
</properties>
</profile>
<profile>
<id>windows-amd64</id>
<activation>
<os>
<family>windows</family>
<arch>amd64</arch>
</os>
</activation>
<properties>
<envClassifier>ntamd64</envClassifier>
<envType>dll</envType>
<native.lib.filename>sapjco3</native.lib.filename>
</properties>
</profile>
<profile>
<id>linux-x86_64</id>
<activation>
<os>
<name>linux</name>
<arch>x86_64</arch>
</os>
</activation>
<properties>
<envClassifier>linuxx86_64</envClassifier>
<envType>so</envType>
<native.lib.filename>libsapjco3</native.lib.filename>
</properties>
</profile>
<profile>
<id>linux-amd64</id>
<activation>
<os>
<name>linux</name>
<arch>amd64</arch>
</os>
</activation>
<properties>
<envClassifier>linuxx86_64</envClassifier>
<envType>so</envType>
<native.lib.filename>libsapjco3</native.lib.filename>
</properties>
</profile>
<profile>
<id>macosx-x86_64</id>
<activation>
<os>
<name>mac os x</name>
<arch>x86_64</arch>
</os>
</activation>
<properties>
<envClassifier>darwinintel64</envClassifier>
<envType>dylib</envType>
<native.lib.filename>libsapjco3</native.lib.filename>
</properties>
</profile>
<profile>
<id>macosx-amd64</id>
<activation>
<os>
<name>mac os x</name>
<arch>amd64</arch>
</os>
</activation>
<properties>
<envClassifier>darwinintel64</envClassifier>
<envType>dylib</envType>
<native.lib.filename>libsapjco3</native.lib.filename>
</properties>
</profile>
有了所有这些,测试工作、mvn quarkus:dev
工作,以及用mvn clean package
完成的包都能工作。
要小心,在默认情况下不会启动Maven的初始化阶段,您需要调用mvn initialize
一次才能发生库副本。
发布于 2021-06-15 00:00:47
我们一直在努力解决皂荚3.jar的命名问题,直到我在这个链接上偶然发现了一个脚注: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
,它将解决命名问题,因为驱动程序接受这个名称,即使添加了版本号。
你的下一个绊脚石将是本地图书馆。在夸克环境中,我还没有解决这个问题,因为我还没有尝试过。
https://stackoverflow.com/questions/65003590
复制相似问题