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

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

我目前尝试将一个通过rfc连接到sap系统的旧JavaEE解决方案迁移到quarkus。由于项目使用maven,我再次面临来自sap的sapjco3.jar库的问题,该库无法重命名。如果我像那样添加库作为依赖项

  1. <dependency>
  2. <groupId>com.sap</groupId>
  3. <artifactId>sapjco3</artifactId>
  4. <version>3.1</version>
  5. </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依赖插件复制它。

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-dependency-plugin</artifactId>
  4. <executions>
  5. <execution>
  6. <id>copy-dependencies</id>
  7. <phase>process-resources</phase>
  8. <goals>
  9. <goal>copy-dependencies</goal>
  10. </goals>
  11. <configuration>
  12. <includeArtifactIds>sapjco3</includeArtifactIds>
  13. <outputDirectory>${project.build.directory}/lib</outputDirectory>
  14. <stripVersion>true</stripVersion>
  15. </configuration>
  16. </execution>
  17. </executions>
  18. </plugin>

不幸的是,这对quarkus不起作用。如果我使用

  1. mvn quarkus:dev

提供的信息似乎被忽略了,我仍然得到了信息。
jco初始化失败,java.lang.exceptionininitializererror:非法jco存档“sapjco3-3.1.jar”。不允许重命名或重新打包原始存档“sapjco3.jar”。
如果我将它打包并尝试将其部署到docker容器中

  1. mvn clean package

如果我将拷贝更改为pom.xml中的另一个阶段,基本上可以将jar文件复制到lib目录

  1. <phase>package</phase>
  2. <goals>
  3. <goal>copy-dependencies</goal>
  4. </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定义库,以便不修改其名称。

  1. <dependency>
  2. <groupId>com.sap</groupId>
  3. <artifactId>sapjco3</artifactId>
  4. <version>3.1</version>
  5. <scope>system</scope>
  6. <systemPath>${project.build.directory}/dependency/sapjco3.jar</systemPath>
  7. </dependency>

然后,配置 maven-dependency-plugin 在初始化阶段复制此路径中的库并将其包含在最终包中。它还包含sapjco3.jar库使用的本机lib的配置。

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-dependency-plugin</artifactId>
  4. <version>3.1.1</version>
  5. <executions>
  6. <execution>
  7. <id>copy-jco-libs-unit-tests</id>
  8. <phase>initialize</phase>
  9. <goals>
  10. <goal>copy</goal>
  11. </goals>
  12. <configuration>
  13. <stripVersion>true</stripVersion>
  14. <outputDirectory>${lib.directory}</outputDirectory>
  15. <artifactItems>
  16. <artifactItem>
  17. <groupId>com.sap.conn.jco</groupId>
  18. <artifactId>sapjco3</artifactId>
  19. <version>${sap.jco.version}</version>
  20. <overWrite>true</overWrite>
  21. <destFileName>sapjco3.jar</destFileName>
  22. </artifactItem>
  23. </artifactItems>
  24. </configuration>
  25. </execution>
  26. <execution>
  27. <id>copy-native-lib-for-unit-tests</id>
  28. <phase>process-sources</phase>
  29. <goals>
  30. <goal>copy</goal>
  31. </goals>
  32. <configuration>
  33. <stripVersion>true</stripVersion>
  34. <outputDirectory>${native.lib.directory}</outputDirectory>
  35. <artifactItems>
  36. <artifactItem>
  37. <groupId>com.sap.conn.jco</groupId>
  38. <artifactId>sapjco3</artifactId>
  39. <version>${sap.jco.version}</version>
  40. <type>${envType}</type>
  41. <classifier>${envClassifier}</classifier>
  42. <overWrite>true</overWrite>
  43. <destFileName>${native.lib.filename}.${envType}</destFileName>
  44. </artifactItem>
  45. </artifactItems>
  46. </configuration>
  47. </execution>
  48. </executions>
  49. </plugin>

最后,根据配置文件配置应该包括哪些本机lib,需要一个os/cpu架构的配置文件。配置如下:

  1. <profiles>
  2. <!-- Manage JCO native deps by OS arch -->
  3. <profile>
  4. <id>windows-x86_64</id>
  5. <activation>
  6. <os>
  7. <family>windows</family>
  8. <arch>x86_64</arch>
  9. </os>
  10. </activation>
  11. <properties>
  12. <envClassifier>ntamd64</envClassifier>
  13. <envType>dll</envType>
  14. <native.lib.filename>sapjco3</native.lib.filename>
  15. </properties>
  16. </profile>
  17. <profile>
  18. <id>windows-amd64</id>
  19. <activation>
  20. <os>
  21. <family>windows</family>
  22. <arch>amd64</arch>
  23. </os>
  24. </activation>
  25. <properties>
  26. <envClassifier>ntamd64</envClassifier>
  27. <envType>dll</envType>
  28. <native.lib.filename>sapjco3</native.lib.filename>
  29. </properties>
  30. </profile>
  31. <profile>
  32. <id>linux-x86_64</id>
  33. <activation>
  34. <os>
  35. <name>linux</name>
  36. <arch>x86_64</arch>
  37. </os>
  38. </activation>
  39. <properties>
  40. <envClassifier>linuxx86_64</envClassifier>
  41. <envType>so</envType>
  42. <native.lib.filename>libsapjco3</native.lib.filename>
  43. </properties>
  44. </profile>
  45. <profile>
  46. <id>linux-amd64</id>
  47. <activation>
  48. <os>
  49. <name>linux</name>
  50. <arch>amd64</arch>
  51. </os>
  52. </activation>
  53. <properties>
  54. <envClassifier>linuxx86_64</envClassifier>
  55. <envType>so</envType>
  56. <native.lib.filename>libsapjco3</native.lib.filename>
  57. </properties>
  58. </profile>
  59. <profile>
  60. <id>macosx-x86_64</id>
  61. <activation>
  62. <os>
  63. <name>mac os x</name>
  64. <arch>x86_64</arch>
  65. </os>
  66. </activation>
  67. <properties>
  68. <envClassifier>darwinintel64</envClassifier>
  69. <envType>dylib</envType>
  70. <native.lib.filename>libsapjco3</native.lib.filename>
  71. </properties>
  72. </profile>
  73. <profile>
  74. <id>macosx-amd64</id>
  75. <activation>
  76. <os>
  77. <name>mac os x</name>
  78. <arch>amd64</arch>
  79. </os>
  80. </activation>
  81. <properties>
  82. <envClassifier>darwinintel64</envClassifier>
  83. <envType>dylib</envType>
  84. <native.lib.filename>libsapjco3</native.lib.filename>
  85. </properties>
  86. </profile>

有了这些,测试工作, mvn quarkus:dev 工作,和一个包完成了 mvn clean package 作品。
注意maven的初始化阶段在默认情况下不是启动的,您需要调用 mvn initialize 只有一次图书馆拷贝发生了。

展开查看全部

相关问题