web-dev-qa-db-fra.com

Erreur Gradle avec absence de la propriété mainClassName dans la génération Gradle

J'ai graddle configuration avec deux sous-projets et quand je veux faire build le projet l'erreur suivante est levée:

Executing external task 'build'...
:core:compileJava
:core:processResources UP-TO-DATE
:core:classes
:core:jar
:core:startScripts FAILED

FAILURE: Build failed with an exception.

* What went wrong:
A problem was found with the configuration of task ':core:startScripts'.
> No value has been specified for property 'mainClassName'.

Ma configuration: ROOT - build.gradle:

subprojects {

    apply plugin: 'Java'
    apply plugin: 'application'

    group = 'pl.morecraft.dev.morepianer'

    repositories {
        mavenLocal()
        mavenCentral()
    }

    run {
        main = project.getProperty('mainClassName')
    }

    jar {
        manifest {
            attributes 'Implementation-Title': project.getProperty('name'),
                    'Implementation-Version': project.getProperty('version'),
                    'Main-Class': project.getProperty('mainClassName')
        }
    }

}

task copyJars(type: Copy, dependsOn: subprojects.jar) {
    from(subprojects.jar)
    into project.file('/jars')
}

ROOT - setting.gradle:

include 'app'
include 'core'

APP PROJECT - build.gradle:

EMPTY

PROJET DE BASE - build.gradle:

dependencies {
    compile 'com.google.dagger:dagger:2.4'
    compile 'com.google.dagger:dagger-compiler:2.4'
}

ET DEUX SOUS-PROJETS (SIMILAIRE) - gradle.properties:

version = 0.1-SNAPSHOT
name = MorePianer Core Lib
mainClassName = pl.morecraft.dev.morepianer.core.Core

J'ai essayé d'ajouter la propriété mainClassName à plusieurs endroits, mais cela ne fonctionnait pas. C'est encore plus étrange, cela a fonctionné il y a quelques jours tel quel. J'utilise Gradle pour la première fois et je pense à revenir à Maven.

14
Mateusz Stefaniak

Le plugin application a besoin de connaître la classe principale pour le moment où il regroupe l’application.

Dans votre cas, vous appliquez le plug-in application à chaque sous-projet sans spécifier la classe principale pour chacun de ces sous-projets.

J'ai eu le même problème et je l'ai corrigé en spécifiant "mainClassName" au même niveau que apply plugin: 'application':

apply plugin: 'application'
mainClassName = 'com.something.MyMainClass'

Si vous voulez le spécifier dans le fichier gradle.properties, vous devrez peut-être l'écrire comme suit: projectName.mainClassName = ..

42
zlandorf

Au lieu de configurer mainClassName, essayez de créer 

task run(type: JavaExec, dependsOn: classes) {
    main = 'com.something.MyMainClass'
    classpath = sourceSets.main.runtimeClasspath
}

Veuillez regarder Gradle échoue lors de l'exécution de la tâche d'exécution pour scala

3
Mika16

Chaque fois que nous lions un script Gradle au plug-in application , Gradle s'attend à ce que nous indiquions le point de départ de l'application. Cela est nécessaire car Gradle commencera à regrouper votre application (jar/zip) en utilisant l'emplacement indiqué comme point d'entrée.
Cette erreur est générée simplement parce que Gradle sait que vous souhaitez regrouper votre application, mais ne sait pas par où commencer le processus de regroupement. 

0
swayamraina

J'ai rencontré le même problème dans mon projet et je l'ai résolu en excluant de gradle.properties:

#ogr.gradle.configurationdemand = true
0
AlexPes