使用gradle的多模块应用程序中没有主清单属性错误

g2ieeal7  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(338)

我有一个包含Gradle的多模块java/Kotlin应用。我想使用.jar在终端中启动我的应用:例如java -jar mayApp.jar

**如何在多模块应用程序中正确构建.jar?**当我尝试进入终端时,IDEA生成的.jar未运行,原因是错误:

no main manifest attribute, in /Users/me/IdeaProjects/MyProject/out/artifacts/MyProject_jar/MyProject.jar

项目结构:

- :ApplicationName
    - :bot-app
        - src/main/java/main
            Main.java // psvm
        - src/main/resources
             - META-INF
                 MANIFEST.MF
        build.gradle // module's build 
        
    - :data
    - :utils
    build.gradle // application (root) build

因此,在我的多模块项目中,主类位于:bot-app模块中,每个模块都有自己的build.gradle,在根项目中,我有应用程序的build.gradle;

模块构建.gradle

buildscript {

    repositories {
        ...
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0"
    }
}

apply plugin: "org.jetbrains.kotlin.jvm"
apply plugin: 'kotlin-kapt'

group 'org.my_project'
version '2.4.0'

repositories {
    mavenCentral()
    maven { url 'https://jitpack.io' }
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib"
}

这是我的根构建。gradle

buildscript {

    repositories {
        ...
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0"
    }
}

apply plugin: 'java'

tasks.withType(Jar) {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    manifest {
        attributes["Main-Class"] = "main.Main"
    }
}

如你所见,我加了

tasks.withType(Jar) {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    manifest {
        attributes["Main-Class"] = "main.Main"
    }
}

但是它对我不起作用。用一个模块就可以了,但是在重构为多模块之后,就不行了。
如何在多模块应用程序中构建.jar?

----统一产品开发商:

如果我删除了根项目中的.gradle文件夹,然后尝试通过IDEA运行应用程序,它工作得很好。但是当我通过IDEA构建工件时,jar被创建,但不工作,并出现错误:no main manifest attribute
IDEA中的每个下一个构建都失败,错误为:'执行任务':bot-app:jar '失败。
META-INF/bot-app.Kotlin_module项重复,但未设置重复处理策略。“
如果我再次删除.gradle,内置IDEA工作得很好。

qvtsj1bj

qvtsj1bj1#

需要删除:

tasks.withType(Jar) {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    manifest {
        attributes["Main-Class"] = "main.Main"
    }
}

这个代码是额外的给我。
然后在项目的根目录下创建MANIFEST.MF
注:您必须通过file->project structure->artifact->+创建它,并且必须在Directory for META-INF/MANIFEST.MF:字段中设置根文件夹位置(不是模块文件夹,而是根)
删除.gradle,清理并构建工件。

相关问题