我正在开发一个使用Web3j与以太坊客户端通信的Spring引导应用程序。结果是Dockerized,可以在我的本地PC和私有服务器上正常工作。 但是在Google Cloud Platform上运行它失败,并出现以下错误。
java.lang.NoClassDefFoundError: Could not initialize class org.web3j.crypto.Sign
这是失败的代码:
Credentials credentials = Credentials.create(pk);
我的Gradle依赖项包括:
compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.60'
compile group: 'org.web3j', name: 'core', version: '4.3.0'
我可以看到Gradle下载了两个与Web3j相关的库,并且都存在于运行的Docker容器中(在GCP和本地)。
core-4.3.0.jar
crypto-4.3.0.jar
我查看了jar文件内部,看到两个jar文件都包含相同的程序包名称org.web3j.crypto
。我怀疑这是否是问题的根源。但是我不明白为什么相同的docker文件可以毫无问题地在本地运行,但是在GCP中却失败了!
这是我构建docker文件的方式:
gradle wrapper --gradle-version 4.8
./gradlew clean build
tar -zxf build/libs/*.jar -C build/libs/
docker build -t $IMAGE_NAME .
这是docker文件:
FROM openjdk:8-jre-alpine
RUN mkdir -p /app/config
ADD "application.yml" /app/config/spring-config.yml
COPY build/libs/BOOT-INF/lib /app/lib
COPY build/libs/META-INF /app/META-INF
COPY build/libs/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","com/*/*/*/Application", "--spring.config.location=/app/config/spring-config.yml"]