前言
本文例子来源于某个业务团队,本文主要记录在协助他们部署接入sap遇到的问题,且只记录解决问题的答案,不说明原理。
问题实录
1、问题一:Illegal JCo archive "sapjco-1.0.jar". It is not allowed to rename or repackage the original archive "sapjco3.jar"
解决方案一:手动项目中将sapjco-1.0.jar重名为sapjco3.jar
不过我们没采用这种方案
解决方案二:指定maven的scope为system,形如下
1 <dependency> 2 <groupId>com.sap</groupId> 3 <artifactId>sapjco</artifactId> 4 <version>${sap.version}</version> 5 <scope>system</scope> 6 <systemPath>${project.basedir}/lib/sapjco3.jar</systemPath> 7 </dependency>
然后指定resources,形如下
1<build> 2 <plugins> 3 <plugin> 4 <groupId>org.springframework.boot</groupId> 5 <artifactId>spring-boot-maven-plugin</artifactId> 6 <version>${spring-boot.version}</version> 7 <executions> 8 <execution> 9 <goals> 10 <goal>repackage</goal> 11 </goals> 12 </execution> 13 </executions> 14 </plugin> 15 <plugin> 16 <artifactId>maven-compiler-plugin</artifactId> 17 <configuration> 18 <source>1.8</source> 19 <target>1.8</target> 20 <encoding>UTF-8</encoding> 21 <compilerArguments> 22 <extdirs>${project.basedir}/lib</extdirs> 23 </compilerArguments> 24 </configuration> 25 </plugin> 26 27 </plugins> 28 29 <resources> 30 <resource> 31 <directory>${project.basedir}/lib</directory> 32 <targetPath>BOOT-INF/lib/</targetPath> 33 <includes> 34 <include>**/*.jar</include> 35 </includes> 36 </resource> 37 <resource> 38 <directory>${project.basedir}/lib</directory> 39 <targetPath>BOOT-INF</targetPath> 40 <includes> 41 <include>**/*.so</include> 42 <include>**/*.dll</include> 43 </includes> 44 </resource> 45 <resource> 46 <directory>src/main/resources</directory> 47 <!--<targetPath>BOOT-INF/classes/</targetPath>--> 48 <includes> 49 <include>**/*.yml</include> 50 <include>**/*.xml</include> 51 </includes> 52 </resource> 53 </resources> 54 </build>
这个的作用是将sapjco3.jar打进BOOT-INF/lib/
问题二:java.lang.UnsatisfiedLinkError: no sapjco3 in java.library.path
因为项目是部署到docker里面去,因此本文只写基于docker的解决方案
解决方案如下:
在dockerFile里面指定LD_LIBRARY_PATH环境变量,形如下
1FROM adoptopenjdk/openjdk8 2VOLUME /tmp 3#ENV JAVA_OPTS="-Dcom.sun.management.jmxremote.port=39083 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" 4ENV JAVA_OPTS="" 5ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH 6COPY localtime /etc/localtime 7RUN echo "Asia/Shanghai" > /etc/timezone 8COPY hello-biz/target/hello-biz-*.jar app.jar 9COPY hello-biz/lib/libsapjco3.so /usr/local/lib/libsapjco3.so 10ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
总结
本来不想写这篇,但从业务团队那边了解到,他们当时百度了很久都没找到合适的答案。因此就记录下这篇文章,看下能否对有遇到此问题的朋友提供一点解决思路