文件中没有主清单属性,在jar包中。
文件中没有主清单属性,在jar包中。
我有一个使用Gradle的spring项目。我在build.gradle
中创建了一个任务:
task dockerFile(type: Dockerfile) { destFile.set(project.file('Dockerfile')) from "alpine:$alpineVersion" runCommand 'apk add --no-cache openjdk11' copyFile "build/libs/${jar.archiveFileName.get()}", '/app/' workingDir '/app/' entryPoint 'java' defaultCommand '-jar', "/app/${jar.archiveFileName.get()}" }
一切都很好。生成了Dockerfile。但是当我尝试运行该镜像时,它会出现错误:/app/demo-0.0.1-SNAPSHOT-plain.jar中没有主清单属性
这是我的整个build.gradle
:
import com.bmuschko.gradle.docker.tasks.image.Dockerfile plugins { id 'java' id 'org.springframework.boot' version '2.7.6' id 'io.spring.dependency-management' version '1.0.15.RELEASE' id 'com.bmuschko.docker-remote-api' version '6.6.1' apply false } group = 'ms10gradle2' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation "org.springframework.boot:spring-boot-starter-data-jpa:$jpaVersion" implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } task printJpaVer{ print "JPA VERSION: ${jpaVersion}" } task printfiles { doLast { def files = "cmd.exe /c dir".execute().text.trim() println(files) project.getAllprojects().forEach(System.out::print) } } task printTasks{ project.getTasks().forEach{ println("task name: "+ it) } } task printTasksInsideSubModulesTrueOrFalse{ project.getAllTasks(false).entrySet().forEach(System.out::println) } task printTaskVersion{ project.getAllprojects() .forEach(p -> println p.name +"- "+p.getVersion()) print "================================================================" project.getAllprojects().forEach(p -> println p.getVersion()) } task dockerFile(type: Dockerfile) { destFile.set(project.file('Dockerfile')) from "alpine:$alpineVersion" runCommand 'apk add --no-cache openjdk11' copyFile "build/libs/${jar.archiveFileName.get()}", '/app/' workingDir '/app/' entryPoint 'java' defaultCommand '-jar', "/app/${jar.archiveFileName.get()}" }
以及Dockerfile:
FROM alpine:3.11.2 RUN apk add --no-cache openjdk11 COPY build/libs/demo-0.0.1-SNAPSHOT-plain.jar /app/ WORKDIR /app/ ENTRYPOINT ["java"] CMD ["-jar", "/app/demo-0.0.1-SNAPSHOT-plain.jar"]
admin 更改状态以发布 2023年5月22日
看起来你试图运行不可执行的jar文件。
假设你的代码中有一个名为fully.qualified.MainClass
的主类,
有两种方法:
- 需要添加带有主类的清单(首选):
对于Maven:
org.apache.maven.plugins maven-jar-plugin ...... true fully.qualified.MainClass
对于Gradle:
必须添加具有Main-Class的jar任务:
jar { manifest { attributes 'Main-Class': 'fully.qualified.MainClass' } }
Jar任务文档并且还有关于Gradle可执行jar的问题:使用Gradle创建可运行的JAR
- 将主类作为参数运行jar:
java -cp MyJar.jar fully.qualified.MainClass