我目前正在尝试将一个通过RFC连接到SAP系统的旧Java EE解决方案迁移到Quarkus。由于项目使用maven,我再次面临sapjco3的问题。来自SAP的jar库,防止该库被重命名。如果我像那样添加库作为依赖项
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco3</artifactId>
<version>3.1</version>
</dependency>
它将被添加到lib目录中,名称为com.sap.sapjco3-3.1.jar.不幸的是,最终以异常结束
JAVAlang.ExceptionInInitializerError:JCo初始化在java中失败。lang.exceptionininitializerror:非法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中的另一个阶段,基本上可以将jar文件复制到lib目录。xml
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
但我首先得到构建警告:
[警告][io.quarkus.arc.processor.BeanArchives]未能为com编制索引。液康涅狄格州jco。ext.DestinationDataProvider:类在类加载器QuarkusClassLoader:部署类加载器中不存在
[INFO][io.quarkus.arc.processor.IndexClassLookupUtils]类的名称:com。液康涅狄格州jco。在Jandex索引中找不到ext.DestinationDataProvider。请确保课程是索引的一部分。
然后出现以下错误:
JAVAlang.NoClassDefFoundError:com/sap/conn/jco/ext/DestinationDataProvider
Quarkus是否有解决方案来处理提供的依赖项,并使用maven手动复制它们?
我们一直在努力解决sapjco3.jar的命名问题,直到我偶然发现了这个链接上的一个脚注:https://help.mulesoft.com/s/article/It-is-not-allowed-to-rename-or-repackage-the-original-archive-sapjco3-jar
命名你的工件com。液康涅狄格州jco。sapjco3。jar
,它将解决命名问题,因为即使添加了版本号,驱动程序也会接受这个名称。
不过,你的下一个绊脚石将是本机库...我没有在夸克环境中解决这一问题的方法,因为我还没有尝试过。
我让SAP库在一个项目中与Quarkus合作。该解决方案并不特定于Quarkus(Spring Boot项目使用相同的解决方案)。
首先,使用系统scome定义库,以便不修改其名称。
<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依赖插件
,在初始化阶段将库复制到此路径中,并将其包含在最终包中。它还包含sapjco3使用的本机库的配置。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配置文件。以下是配置:
<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夸克斯: dev工作,用mvn清洁包完成的包工作。
请注意,Maven的初始化阶段在默认情况下不会启动,您需要调用mvn initialize
一次,才能进行库复制。
我正在尝试构建一个Bukkit插件。该插件还使用exp4j。最终结果需要在发布的jar中包含exp4j代码,但不包含Bukkit代码。 我按照这个答案的建议将依赖项复制到中,并使用这个答案将Bukkit声明为已提供。我的build.gradle现在看起来像这样: 这非常有效,我可以从命令行使用Gradle愉快地构建和运行项目。问题在于Intellij(或者可能是Gradle idea插件)无法识别
我有一个J2ee项目,它使用了诸如Jsf、EJB、持久性API等技术。但是我怎么知道这些模块需要的wich版本。例如: 现在,我在maven中央存储库中查找这些信息:GroupId、ArtifactID和最新版本。但有一个更简单的方法做到这一点?
我正在尝试编译几个WAR文件,所有这些都依赖于一个公共的JAR模块。然而,在我的Gradle构建中,我似乎无法获得类似于“提供”的依赖关系来使用Java插件。 然而,最后这一位将生成具有适当依赖关系的变量newRuntime,然而,当我试图将该变量重新分配回运行时配置时,它抛出一个“无法找到属性异常”。 我在Gradle的bug跟踪中发现了很多关于这个问题的讨论:Gradle-784 然而,这方面
编写的PHP扩展需要需要依赖另外一个扩展,在PHP-X中可以调用Extension->require来实现。 PHPX_EXTENSION() { Extension *ext = new Extension("test", "0.0.1"); ext->require("swoole"); ext->require("sockets"); return ext;
依赖关系 这是一个非常轻量级的模块,没有其他依赖项。希望大家在JVM或Android上使用以太坊的RLP编码的项目时会选择使用这个模块,而不再编写自己的实现。
依赖关系 ABI一个非常轻量级的模块,唯一的第三方依赖是 Bouncy Castle,用于hash加密 (Spongy Castle on Android)。 最后希望java和安卓开发者,在JVM或Android上有以太坊ABI合作的项目时会选择使用这个模块,而不是再编写自己的实现。