Gradle - Hauptklasse konnte nicht gefunden oder geladen werden

75

Ich versuche, ein sehr einfaches Projekt mit Gradle auszuführen, und bei der Verwendung von gradlew run command: tritt der folgende Fehler auf :

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

Hier ist meine Dateistruktur:

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

Ich habe den Inhalt der Ordner libs und tmp ausgeschlossen, da ich nicht dachte, dass dies relevante Informationen für dieses Problem sind, aber ich kann sie bei Bedarf hinzufügen.

Hier ist meine build.gradle-Datei:

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'
}

Haben Sie eine Idee, wie Sie dieses Problem beheben können? Ich habe alle möglichen Dinge für das Attribut mainClassName ausprobiert, aber nichts scheint zu funktionieren.

Twilco
quelle

Antworten:

75

Ich sehe hier zwei Probleme, eines mit dem sourceSetanderen mainClassName.

  1. Verschieben Sie entweder Java-Quelldateien nach src/main/javastatt nur src. Oder stellen Sie die Einstellungen sourceSetrichtig ein, indem Sie build.gradle Folgendes hinzufügen.

    sourceSets.main.java.srcDirs = ['src']
    
  2. mainClassName sollte ein vollständig qualifizierter Klassenname sein, kein Pfad.

    mainClassName = "hello.HelloWorld"
    
kdabir
quelle
Wo ändere ich sourceSets? In meiner build.gradle-Datei? Oder gibt es eine Konfigurationsdatei, die ich ändern muss?
Twilco
2
Wenn ich hinzufüge, sourceSets.main.java.srcDirs = ['src']erhalte ich einen Fehler in der
Glasaufgabe
MissingPropertyException: Could not set unknown property 'mainClassName'für Gradlew 4.1
Fuat
30

Ändern Sie build.gradle, um Ihre Hauptklasse in das Manifest aufzunehmen:

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

Ich bin gerade auf dieses Problem gestoßen und habe beschlossen, es selbst zu debuggen, da ich im Internet keine Lösung finden konnte. Ich habe nur den mainClassName in den gesamten Pfad geändert (mit den richtigen Unterverzeichnissen im Projekt ofc).

    mainClassName = 'main.java.hello.HelloWorld'

Ich weiß, dass es fast ein Jahr her ist, seit der Beitrag verfasst wurde, aber ich denke, jemand wird diese Informationen nützlich finden.

Viel Spaß beim Codieren.

Hepifisch
quelle
10

Nur um Neulingen klar zu machen, die versuchen, ein Gradle-Projekt über Netbeans auszuführen:
Um dies zu verstehen, müssen Sie sehen, wie der Name der Hauptklasse aussieht und wie der Gradle-Build aussieht:

Hauptklasse:

package com.stormtrident;

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

Beachten Sie, dass es Teil des Pakets "com.stormtrident" ist.

Gradle Build:

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'
}
Nav
quelle
1
Für mich hat das Hinzufügen Ihres JAR-Bits {manifest {Attribute}} geholfen. Vielen Dank!
Paul
Was macht Netbeans anders, als Gradle anders zu laufen scheint? Ich versuche dies manuell, damit ich Gradle besser verstehen kann. Netbeans scheint in Maven wirklich gut zu sein, aber Gradle scheint in Netbeans zerbrechlich zu sein.
cody.tv.weber
2

Ich hatte einige Zeit mit dem gleichen Problem zu kämpfen. Nachdem die Verzeichnisstruktur src / main / java erstellt und die Quelle (oben im Paket) eingefügt wurde, funktionierte sie wie erwartet.

Das Tutorial , mit dem ich es versucht habe. Nach der Ausführung gradle buildmüssen Sie in der Lage sein, classesunter buildVerzeichnis zu finden .

Dino Tw
quelle
1
Da dies von niemand anderem angegeben wird, muss sich die build.gradleDatei "neben" dem src/Verzeichnis befinden, nicht zusammen mit den .java-Dateien insrc/main/java/hello/
joakimk
2

Für Netbeans 11-Benutzer funktioniert dies für mich:

apply plugin: 'java'
apply plugin: 'application'

// This comes out to package + '.' + mainClassName
mainClassName = 'com.hello.JavaApplication1'

Hier ist im Allgemeinen mein Baum:

C:\...\NETBEANSPROJECTS\JAVAAPPLICATION1
│   build.gradle
├───src
│   ├───main
│   │   └───java
│   │       └───com
│   │           └───hello
│   │                   JavaApplication1.java
│   │
│   └───test
│       └───java
└───test
cody.tv.weber
quelle
1

In meinem build.gradle habe ich dieses Problem behoben, indem ich eine Aufgabe erstellt und dann den "mainClassName" wie folgt angegeben habe:

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

Wenn Sie sich entschieden haben, Ihre hello.WorldKlasse in Kotlin zu schreiben , besteht ein weiteres Problem möglicherweise darin, dass Sie darauf verweisen müssen mainClassName = "hello.WorldKt".

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

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

Ich habe dies behoben, indem ich ein Clean-by-Gradle-Build ausgeführt habe (oder den Gradle-Build-Ordner manuell löschte).

Dies tritt auf, wenn Sie die Hauptklasse in ein neues Paket verschieben und die alte Hauptklasse weiterhin im Klassenpfad referenziert wird

JohnTheBeloved
quelle
1
build / clean + build / build erstellt Build erstellt nicht das Laufzeitproblem
MonoThreaded
0

Als ich diesen Fehler hatte, war es, weil ich meine Klasse nicht in einem Paket hatte . Legen Sie Ihre HelloWorld.javaDatei in einem "Paket" -Ordner ab. Möglicherweise müssen Sie einen neuen Paketordner erstellen:

Klicken Sie mit der rechten Maustaste auf den helloOrdner und wählen Sie "Neu"> "Paket". Geben Sie ihm dann einen Namen (z. B. com.example) und verschieben Sie Ihre HelloWorld.javaKlasse in das Paket.

RichArt
quelle
0
  1. Überprüfen Sie, ob gradle.properties die richtige JAVA_HOVE definiert

    org.gradle.java.home = C: \ Programme (x86) \ Java \ jdk1.8.0_181

oder

  1. Wenn es nicht definiert ist, stellen Sie sicher, dass Eclipse JDK und nicht JRE kennt

Geben Sie hier die Bildbeschreibung ein

Stock
quelle
0

Ich habe es behoben, indem ich meiner Anwendung den folgenden Code hinzugefügt habe.

// Code hier eingeben Dies ist ein Fehler, den ich beim Ausführen von build.gradle erhalten habe. Der Name der Hauptklasse wurde nicht konfiguriert und konnte nicht aufgelöst werden

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
Premakumar
quelle
Das ist bereits der Einstiegspunkt für den Start eines Springboot-Projekts und die Frage
betrifft
0

Für eine Projektstruktur wie

project_name/src/main/java/Main_File.class

Fügen Sie in der Datei build.gradledie folgende Zeile hinzu

mainClassName = 'Main_File'
kapsid
quelle
Willkommen bei SO!. Bitte bearbeiten Sie Ihre Frage und erläutern Sie ein wenig, warum Ihre Lösung funktioniert, dh was genau Sie tun.
B - rian