首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >和提供的依赖关系(subjco3.jar)

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

Stack Overflow用户
提问于 2020-11-25 03:15:51
回答 2查看 1.2K关注 0票数 1

目前,我试图迁移一个旧的Java解决方案,该解决方案通过RFC连接到SAP系统,并与Quarkus进行连接。由于该项目使用maven,我再次面临SAP中的皂荚3.jar库的问题,这个问题阻止了这个库的重命名。如果我像这样将库作为依赖项添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     <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依赖插件中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <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>

不幸的是,这并不适用于夸克。在开发中,如果我使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn quarkus:dev

提供的信息似乎被忽略了,我仍然得到了信息。

JCo初始化失败与java.lang.ExceptionInInitializerError:非法的JCo存档“皂荚3-3.1.jar”。它不允许重命名或重新打包原始存档“subjco3.jar”。

如果我将它打包并尝试将它部署到一个码头容器中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn clean package

如果我将jar文件复制到pom.xml的另一个阶段,它基本上可以将jar文件复制到lib目录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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手动复制它们?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-25 04:06:03

我让SAP库在一个项目中与Quarkus一起工作。该解决方案不特定于Quarkus ( Spring项目使用相同的解决方案)。

首先,使用system定义库,这样它的名称就不会被修改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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库使用的本机库的配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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配置文件。以下是配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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一次才能发生库副本。

票数 3
EN

Stack Overflow用户

发布于 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,它将解决命名问题,因为驱动程序接受这个名称,即使添加了版本号。

你的下一个绊脚石将是本地图书馆。在夸克环境中,我还没有解决这个问题,因为我还没有尝试过。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65003590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文