quarkus和提供的依赖项(sapjco3.jar)

cuxqih21  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(435)

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

n3schb8v

n3schb8v1#

我有sap库在一个项目中与quarkus合作。该解决方案并不特定于quarkus(spring引导项目使用相同的解决方案)。
首先,使用系统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库使用的本机lib的配置。

<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>

最后,根据配置文件配置应该包括哪些本机lib,需要一个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 quarkus:dev 工作,和一个包完成了 mvn clean package 作品。
注意maven的初始化阶段在默认情况下不是启动的,您需要调用 mvn initialize 只有一次图书馆拷贝发生了。

相关问题