当前位置: 首页 > 知识库问答 >
问题:

和提供的依赖关系(sapjco3.jar)

章哲茂
2023-03-14

我目前正在尝试将一个通过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手动复制它们?

共有2个答案

孙玮
2023-03-14

我们一直在努力解决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,它将解决命名问题,因为即使添加了版本号,驱动程序也会接受这个名称。

不过,你的下一个绊脚石将是本机库...我没有在夸克环境中解决这一问题的方法,因为我还没有尝试过。

葛鸿轩
2023-03-14

我让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合作的项目时会选择使用这个模块,而不是再编写自己的实现。