文件中没有主清单属性,在jar包中。

10 浏览
0 Comments

文件中没有主清单属性,在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日
0
0 Comments

看起来你试图运行不可执行的jar文件。
假设你的代码中有一个名为fully.qualified.MainClass的主类,
有两种方法:

  1. 需要添加带有主类的清单(首选):

对于Maven:


        org.apache.maven.plugins
        maven-jar-plugin
        ...
        
          
            
              true
              fully.qualified.MainClass
            
          
        
        ...
      

有关更多信息,请参阅Maven文档。

对于Gradle:

必须添加具有Main-Class的jar任务:

jar {
  manifest {
   attributes 'Main-Class': 'fully.qualified.MainClass'
  }
}

Jar任务文档并且还有关于Gradle可执行jar的问题:使用Gradle创建可运行的JAR

  1. 将主类作为参数运行jar:

java -cp MyJar.jar fully.qualified.MainClass

如何从具有非Manifest文件中的主类的Jar运行类

0