Chr*_*rno 3 java gradle redis docker
情况很简单:
这是我的本地环境:
cbongiorno at wa-cbongiorno-mba in /Volumes/dev/sterling/java-user-login-service on master [!$]
$ gradle -v
------------------------------------------------------------
Gradle 4.0
------------------------------------------------------------
Build time: 2017-06-14 15:11:08 UTC
Revision: 316546a5fcb4e2dfe1d6aa0b73a4e09e8cecb5a5
Groovy: 2.4.11
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_131 (Oracle Corporation 25.131-b11)
OS: Mac OS X 10.12.5 x86_64
Run Code Online (Sandbox Code Playgroud)
这是我运行的构建命令:
gradle compileJava check assemble && history | tail -3
Run Code Online (Sandbox Code Playgroud)
结果如下:
BUILD SUCCESSFUL in 3m 3s
38 actionable tasks: 38 executed
1496 gradle clean
1497 gradle compileJava check assemble && history | tail -2
Run Code Online (Sandbox Code Playgroud)
现在,当我在 docker 中运行这个相同的安排时:
docker run --rm gradle:alpine gradle -v
------------------------------------------------------------
Gradle 4.0
------------------------------------------------------------
Build time: 2017-06-14 15:11:08 UTC
Revision: 316546a5fcb4e2dfe1d6aa0b73a4e09e8cecb5a5
Groovy: 2.4.11
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_131 (Oracle Corporation 25.131-b11)
OS: Linux 4.9.36-moby amd64
docker run --rm -v "$PWD":/project -w /project gradle:alpine gradle compileJava check assemble
Run Code Online (Sandbox Code Playgroud)
测试失败,在日志中我得到:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy
build_1 | at org.redisson.codec.SnappyCodec$2.encode(SnappyCodec.java:68)
build_1 | at org.redisson.client.handler.CommandEncoder.encode(CommandEncoder.java:103)
build_1 | at org.redisson.client.handler.CommandEncoder.encode(CommandEncoder.java:45)
build_1 | at io.netty.handler.codec.MessageToByteEncoder.write(MessageToByteEncoder.java:107)
build_1 | ... 31 more
build_1 |
build_1 |
build_1 | io.netty.handler.codec.EncoderException: java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy
Run Code Online (Sandbox Code Playgroud)
当我的应用程序尝试与 Redis 交互时。
这到底怎么可能?这是一个红鲱鱼,问题与 docker 环境本身有关吗?我猜档案已损坏/错误,但 docker 容器将从相同的工件存储库中提取。所以,我什至不知道从哪里开始
我使用这里的答案将每个 jar 的哈希值转储到一个文件中:
docker run --rm -v "$PWD":/project -w /project gradle:alpine gradle printDependencyHashes | sort > hashes-docker.log
gradle printDependencyHashes | sort > hashes.log
Run Code Online (Sandbox Code Playgroud)
分别。结果是相同的。我什至想过来自文件系统的 jar 加载顺序如何影响类加载和比较依赖项。完全相同的。为简洁起见省略。
Java Snappy 的本机库(通过 JNI 加载)是针对 glibc 编译的。Alpine Linux(您的容器基于什么)使用与源代码兼容但不与二进制兼容的 musl libc(基本上意味着如果您针对 musl 编译本机库,它将可以工作,但是如果针对 glibc 进行编译,它将无法工作与musl)。
您有三个选择:
java-snappy-native
在您的 Alpine 容器中安装(包含为 musl 构建的本机库)并设置org.xerial.snappy.use.systemlib=true
(告诉 Java 库使用预安装的本机库)。snappy
因为有人未能将该依赖项添加到上述包中。 归档时间: |
|
查看次数: |
1421 次 |
最近记录: |