有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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手动复制它们


共 (2) 个答案

  1. # 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. # 2 楼答案

    我让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-dependency-plugin,在初始化阶段将库复制到此路径中,并将其包含在最终的包中。它还包含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>
    

    有了所有这些,test工作了,mvn quarkus:dev工作了,用mvn clean package完成的包工作了

    请注意,默认情况下不会启动Maven的初始化阶段,需要调用mvn initialize一次库拷贝