我正在尝试使用jdeps和jlink为Spring微服务创建一个最小的jre,但是当我进入使用jdeps部分时,我会得到以下错误
Exception in thread "main" java.lang.module.FindException: Module java.annotation not found, required by org.apache.tomcat.embed.core
at java.base/java.lang.module.Resolver.findFail(Resolver.java:893)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:192)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:141)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:421)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:255)
at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:564)
at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:603)
at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:557)
at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)
at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)我已经尝试了以下命令,但没有效果
jdeps --ignore-missing-deps --multi-release 17 --module-path target/lib/* target/errorrr-*.jar
jdeps --multi-release 16 --module-path target/lib/* target/errorrr-*.jar
jdeps --ignore-missing-deps --multi-release 17 --class-path target/lib/* target/errorrr-*.jar我已经尝试过java版本11、16和17以及Spring的不同版本。
在运行mvn安装时,maven依赖插件插件将生成所需的所有依赖项复制到目标/lib文件夹中。
在确定了负责任的依赖之后,我从零开始创建了一个新项目,它只用于隔离错误,但它仍然存在。
一开始我试着使用gradle,但是由于错误仍然存在,我将它更改为mavem,但也没有改变。
当我添加被请求的指定依赖项时,错误将更改为
#13 1.753 Exception in thread "main" java.lang.Error: java.util.concurrent.ExecutionException: com.sun.tools.jdeps.MultiReleaseException
#13 1.753 at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.waitForTasksCompleted(DependencyFinder.java:271)
#13 1.753 at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.parse(DependencyFinder.java:133)
#13 1.753 at jdk.jdeps/com.sun.tools.jdeps.DepsAnalyzer.run(DepsAnalyzer.java:129)
#13 1.753 at jdk.jdeps/com.sun.tools.jdeps.ModuleExportsAnalyzer.run(ModuleExportsAnalyzer.java:74)
#13 1.753 at jdk.jdeps/com.sun.tools.jdeps.JdepsTask$ListModuleDeps.run(JdepsTask.java:1047)
#13 1.753 at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:574)
#13 1.753 at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)
#13 1.753 at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)
#13 1.753 Caused by: java.util.concurrent.ExecutionException: com.sun.tools.jdeps.MultiReleaseException
#13 1.753 at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
#13 1.753 at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
#13 1.753 at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.waitForTasksCompleted(DependencyFinder.java:267)
#13 1.754 ... 7 more
#13 1.754 Caused by: com.sun.tools.jdeps.MultiReleaseException
#13 1.754 at jdk.jdeps/com.sun.tools.jdeps.VersionHelper.add(VersionHelper.java:62)
#13 1.754 at jdk.jdeps/com.sun.tools.jdeps.ClassFileReader$JarFileReader.readClassFile(ClassFileReader.java:360)
#13 1.754 at jdk.jdeps/com.sun.tools.jdeps.ClassFileReader$JarFileIterator.hasNext(ClassFileReader.java:402)
#13 1.754 at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.lambda$parse$5(DependencyFinder.java:179)
#13 1.754 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
#13 1.754 at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
#13 1.754 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
#13 1.754 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
#13 1.754 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
#13 1.754 at java.base/java.lang.Thread.run(Thread.java:833)我的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>errorrr</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>errorrr</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>如果我不需要使用这个依赖项,我可以完成所有的构建过程,最后我有一个76 at jre
发布于 2022-01-20 22:48:03
我找到了一个有效、不完美的解决方案,但它的工作原理是正确的。在我的例子中,“杰克逊”是问题的根源。它使用了java多版本,并且在jdep期间不知怎么地导致了一些错误。经过一些测试,我知道我可以从评估中删除这个库,并且deps.info中不会缺少任何模块。我需要添加这个任务以便删除:
task myDeleteTask(type: Delete) {
delete files("${buildDir}/temp-lib/jackson-databind-{your_version}.jar")
delete files("${buildDir}/temp-lib/jackson-datatype-jdk8-{your_version}.jar")
delete files("${buildDir}/temp-lib/jackson-datatype-jsr310-{your_version}.jar")
delete files("${buildDir}/temp-lib/jackson-module-parameter-names-{your_version}.jar")
delete files("${buildDir}/temp-lib/jackson-core-{your_version}.jar")
delete files("${buildDir}/temp-lib/jackson-dataformat-cbor-{your_version}.jar")
}
task tempCopyDependencies(type: Copy) {
from configurations.runtimeClasspath
into "$buildDir/temp-lib"
}
tasks.named("build"){
finalizedBy("tempCopyDependencies")
finalizedBy("myDeleteTask")
}在这个问题中,我使用maven是因为它更容易,而且我有更广泛的知识,但是我真正的项目使用gradle,这最终使删除任务更容易完成。
发布于 2022-04-26 10:12:45
我面临着一个类似的问题,在我的例子中有帮助的是,指定--class-path和--module-path都指向同一个目录并使用libs。根据你的例子,我认为应该是jdeps --ignore-missing-deps --print-module-deps --multi-release 17 --module-path="target/lib/*" --class-path="target/lib/*" target/errorrr-*.jar。
另外,来自JDK 17 (可能更早版本)的jdeps是seems to have a bug where it can throw com.sun.tools.jdeps.MultiReleaseException。它似乎是在JDK 18中修复的,至少对我来说没有任何问题。
使用Docker,您可以进行分阶段构建,首先使用JDK 18识别依赖项,然后使用JDK 17构建一个新的JRE映像。
FROM amazoncorretto:18-alpine as deps
COPY ./app.jar /app/app.jar
RUN mkdir /app/unpacked && \
cd /app/unpacked && \
unzip ../app.jar && \
cd .. && \
$JAVA_HOME/bin/jdeps \
--ignore-missing-deps \
--print-module-deps \
-q \
--recursive \
--multi-release 17 \
--class-path="./unpacked/BOOT-INF/lib/*" \
--module-path="./unpacked/BOOT-INF/lib/*" \
./app.jar > /deps.info
FROM amazoncorretto:17.0.3-alpine as corretto-jdk
RUN apk add --no-cache binutils
COPY --from=deps /deps.info /deps.info
RUN $JAVA_HOME/bin/jlink \
--verbose \
--add-modules $(cat /deps.info) \
--strip-debug \
--no-man-pages \
--no-header-files \
--compress=2 \
--output /customjre您可以在这里查看完整的示例:https://github.com/monosoul/jvm-in-docker/blob/main/jre-slim-auto.dockerfile
对于感兴趣的人,这里有一篇关于使用jlink和jdeps:https://blog.monosoul.dev/2022/04/25/reduce-java-docker-image-size/的博客文章
发布于 2021-12-28 14:39:59
在我的gradle spring引导项目中,我一直在努力解决类似的问题,我正在使用下面的输出在我的dockerfile with (openjdk:17-alpine)中添加jlink中的模块:
RUN jdeps \
--ignore-missing-deps \
-q \
--multi-release 17 \
--print-module-deps \
--class-path build/lib/* \
app.jar > deps.info
RUN jlink --verbose \
--compress 2 \
--strip-java-debug-attributes \
--no-header-files \
--no-man-pages \
--output jre \
--add-modules $(cat deps.info)我认为只要您有所有所需的依赖项,您的mvn构建就可以了。但是,为了防止我修改gradle jar任务,使其包含依赖项,如下所示:
jar {
manifest {
attributes "Main-Class": "com.demo.Application"
}
duplicatesStrategy = DuplicatesStrategy.INCLUDE
from {
configurations.default.collect { it.isDirectory() ? it : zipTree(it)
}
}
}https://stackoverflow.com/questions/70105271
复制相似问题