web-dev-qa-db-fra.com

Gradle - Impossible de trouver ou de charger la classe principale

J'essaie de lancer un projet très simple avec Gradle et de rencontrer l'erreur suivante avec le gradlew run command:

could not find or load main class 'hello.HelloWorld'

Voici la structure de mon fichier:

SpringTest
    -src
        -hello
            -HelloWorld.Java
            -Greeter.Java
    -build
         -libs
         -tmp
    -gradle
         -wrapper
    -build.gradle
    -gradlew
    -gradlew.bat

J'ai exclu le contenu des dossiers libs et tmp car je ne pensais pas que ce serait une information pertinente pour ce problème, mais je peux l'ajouter si nécessaire.

Voici mon fichier build.gradle:

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

mainClassName = 'hello/HelloWorld'

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    compile "joda-time:joda-time:2.2"
}

jar {
    baseName = "gs-gradle"
    version = "0.1.0"
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

Une idée sur la façon de résoudre ce problème? J'ai essayé toutes sortes de choses pour l'attribut mainClassName mais rien ne semble fonctionner.

47
twilco

Je vois deux problèmes ici, un avec sourceSet un autre avec mainClassName.

  1. Déplacez les fichiers source Java vers src/main/Java au lieu de src. Ou définissez correctement sourceSet en ajoutant ce qui suit à build.gradle.

    sourceSets.main.Java.srcDirs = ['src']
    
  2. mainClassName devrait être un nom de classe complet, pas un chemin.

    mainClassName = "hello.HelloWorld"
    
54
kunal

Modifiez build.gradle pour mettre votre classe principale dans le manifeste:

jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart',
                   'Implementation-Version': version,
                   'Main-Class': 'hello.helloWorld'
    }
}
22
Noumenon

Je viens de rencontrer ce problème et j'ai décidé de le déboguer moi-même, car je ne trouvais pas de solution sur Internet. Tout ce que j'ai fait est de changer le mainClassName en son chemin complet (avec les sous-répertoires appropriés dans le projet ofc)

    mainClassName = 'main.Java.hello.HelloWorld'

Je sais que cela fait presque un an que le poste a été publié, mais je pense que quelqu'un trouvera cette information utile.

Bonne codage.

17
hepifish

Pour que ce soit clair pour les débutants qui essaient d’exécuter un projet de gradation à partir de Netbeans:
Pour comprendre cela, vous devez voir à quoi ressemble le nom de la classe principale et à quoi ressemble la construction de gradle: 

Classe principale: 

package com.stormtrident;

public class StormTrident {
    public static void main(String[] cmdArgs) {
    }
}

Notez qu'il fait partie du package "com.stormtrident".

Gradle construction: 

apply plugin: 'Java'

defaultTasks 'jar'

jar {
 from {
        (configurations.runtime).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }    
    manifest {
        attributes 'Main-Class': 'com.stormtrident.StormTrident'
    }
}


sourceCompatibility = '1.8'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

if (!hasProperty('mainClass')) {
    ext.mainClass = 'com.stormtrident.StormTrident'
}

repositories {
    mavenCentral()
}

dependencies {
    //---Apache storm
    compile 'org.Apache.storm:storm-core:1.0.0'  //compile 
    testCompile group: 'junit', name: 'junit', version: '4.10'
}
7
Nav

Lutté avec le même problème pendant un certain temps. Mais après avoir créé la structure de répertoires src/main/Java et mis le source (du haut du paquet), cela a fonctionné comme prévu.

Le tutorial J'ai essayé avec. Après avoir exécuté gradle build, vous devrez pouvoir trouver classes dans le répertoire build.

1
Dino Tw

Dans mon build.gradle, j'ai résolu ce problème en créant une tâche puis en spécifiant le "mainClassName" comme suit:

task(runSimpleXYZProgram, group: 'algorithms', description: 'Description of what your program does', dependsOn: 'classes', type: JavaExec) {
    mainClassName = 'your.entire.package.classContainingYourMainMethod'
}
1
Psi-Ed

Je l'ai résolu en ajoutant le code ci-dessous à mon application.

// entrez le code ici c'est l'erreur que je rencontrais lorsque j'exécute build.gradle. le nom de la classe principale n'a pas été configuré et il n'a pas pu être résolu

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
1
Premakumar

J'ai résolu ce problème en exécutant un nettoyage de Gradle Build (ou en supprimant manuellement le dossier Gradle Build).

Cela se produit si vous déplacez la classe principale vers un nouveau package et que l'ancienne classe principale est toujours référencée dans le champ claspath.

0
JohnTheBeloved
  1. vérifier si gradle.properties définit bien Java_HOVE

    org.gradle.Java.home = C:\Fichiers de programme (x86)\Java\jdk1.8.0_181

ou 

  1. si ce n'est pas défini, assurez-vous qu'Eclipse connaisse JDK et non JRE

 enter image description here

0
cane

Quand j'ai eu cette erreur, c'était parce que je n'avais pas ma classe dans un paquet. Placez votre fichier HelloWorld.Java dans un dossier "package". Vous devrez peut-être créer un nouveau dossier de package:

Faites un clic droit sur le dossier hello et sélectionnez "Nouveau"> "Package". Puis donnez-lui un nom (par exemple: com.example) et déplacez votre classe HelloWorld.Java dans le package.

0
RichArt

Pour une structure de projet comme

project_name/src/main/Java/Main_File.class

dans le fichier build.gradle, ajoutez la ligne suivante

mainClassName = 'Main_File'
0
kapsid

Si vous avez décidé d'écrire votre classe hello.World dans Kotlin, un autre problème pourrait être que vous deviez la référencer avec mainClassName = "hello.WorldKt".

src/main/Java/hello/World.kt:

package hello
fun main(args: Array<String>) {
    ...
}
// class World {} // this line is not necessary
0
Giszmo