Gradle - не удалось найти или загрузить основной класс

Я пытаюсь запустить очень простой проект с помощью Gradle и сталкиваюсь со следующей ошибкой при использовании gradlew run command:

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

Вот моя файловая структура:

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

Я исключил содержимое папок libs и tmp, потому что не думал, что это будет актуальная информация для этой проблемы, но я могу добавить ее при необходимости.

Вот мой файл 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'
}

Есть идеи, как решить эту проблему? Я пробовал все что угодно для атрибута mainClassName, но ничего не работает.


person kibowki    schedule 24.07.2014    source источник


Ответы (15)


Я вижу здесь две проблемы: одну с sourceSet, другую с mainClassName.

  1. Либо переместите исходные файлы java в src/main/java, а не только в src. Или установите sourceSet правильно, добавив следующее в build.gradle.

    sourceSets.main.java.srcDirs = ['src']
    
  2. mainClassName должно быть полным именем класса, а не путем.

    mainClassName = "hello.HelloWorld"
    
person kdabir    schedule 24.07.2014
comment
Где я могу изменить sourceSets? В моем файле build.gradle? Или есть файл конфигурации, который мне нужно изменить? - person kibowki; 25.07.2014
comment
При добавлении sourceSets.main.java.srcDirs = ['src'] выдает ошибку в задаче jar - person Victor M Herasme Perez; 08.06.2019
comment
MissingPropertyException: Could not set unknown property 'mainClassName' для Gradlew 4.1 - person fuat; 06.11.2020
comment
@fuat вам нужен плагин приложения - person VFX; 02.05.2021

Измените build.gradle, чтобы поместить ваш основной класс в манифест:

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

Я просто столкнулся с этой проблемой и решил отладить ее сам, так как я не мог найти решение в Интернете. Все, что я сделал, это изменил mainClassName на весь путь (с правильными подкаталогами в проекте ofc)

    mainClassName = 'main.java.hello.HelloWorld'

Я знаю, что с момента публикации сообщения прошел почти год, но я думаю, что кто-то сочтет эту информацию полезной.

Удачного кодирования.

person hepifish    schedule 04.05.2015

Просто чтобы прояснить для новичков, пытающихся запустить проект gradle из Netbeans:
Чтобы понять это, вам нужно увидеть, как выглядит имя основного класса и как выглядит сборка gradle:

Основной класс:

package com.stormtrident;

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

Обратите внимание, что это часть пакета com.stormtrident.

Сборка Gradle:

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'
}
person Nav    schedule 17.04.2016
comment
Мне помогло добавление бита jar {manifest {attributes}}. Спасибо! - person Paul; 21.10.2016
comment
Что Netbeans делает иначе, чем Gradle, похоже, работает иначе? Я пытаюсь сделать это вручную, чтобы лучше понять Gradle. Netbeans, кажется, действительно хорош в Maven, но Gradle кажется хрупким в Netbeans. - person cody.tv.weber; 22.10.2019

Некоторое время боролся с той же проблемой. Но после создания структуры каталогов src / main / java и размещения исходного кода (из верхней части пакета) все заработало, как ожидалось.

Я пробовал использовать учебник. После выполнения gradle build вы сможете найти classes в build каталоге.

person Dino Tw    schedule 21.12.2015
comment
Кроме того, поскольку никто другой это не указывает: файл build.gradle должен находиться рядом с каталогом src/, а не вместе с файлами .java в src/main/java/hello/ - person joakimk; 25.01.2016

Для пользователей Netbeans 11 это работает для меня:

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

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

Вот вообще мое дерево:

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

В моем build.gradle я решил эту проблему, создав задачу и указав «mainClassName» следующим образом:

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

Если вы решили написать свой hello.World класс на Kotlin, другая проблема может заключаться в том, что вам придется ссылаться на него как на mainClassName = "hello.WorldKt".

SRC / основной / Java / привет / World.kt:

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

Я исправил это, выполнив очистку с помощью сборки gradle (или вручную удалив папку сборки gradle)

Это происходит, если вы перемещаете основной класс в новый пакет, а старый основной класс по-прежнему упоминается в пути к классам.

person JohnTheBeloved    schedule 11.01.2017
comment
build / clean + build / build действительно сборка сборка не устраняет проблему времени выполнения - person MonoThreaded; 21.08.2018

Когда у меня возникла эта ошибка, это произошло потому, что у меня не было моего класса в пакете. Поместите ваш HelloWorld.java файл в папку "пакет". Возможно, вам придется создать новую папку пакета:

Щелкните правой кнопкой мыши папку hello и выберите «Создать»> «Пакет». Затем дайте ему имя (например, com.example) и переместите свой класс HelloWorld.java в пакет.

person RichArt    schedule 26.07.2017

  1. проверьте, правильно ли gradle.properties определяет JAVA_HOVE

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

or

  1. если он не определен, убедитесь, что Eclipse знает JDK, а не JRE

введите описание изображения здесь

person cane    schedule 09.08.2018

Я решил это, добавив в свое приложение код ниже.

// введите здесь код, это ошибка, которую я получал при запуске build.gradle. имя основного класса не было настроено и не может быть разрешено

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
person Premakumar    schedule 14.09.2018
comment
Это уже точка входа для запуска проекта springboot, и вопрос заключается в конфликтах конфигурации, а не в том, как запустить проект. - person aya salama; 08.11.2019

Для такой структуры проекта, как

project_name/src/main/java/Main_File.class

в файле build.gradle добавьте следующую строку

mainClassName = 'Main_File'
person kapsid    schedule 15.08.2019
comment
Добро пожаловать в SO !. Отредактируйте свой вопрос и поясните, почему ваше решение работает, т.е. что именно вы делаете. - person B--rian; 15.08.2019

Если вы используете Spring Boot, проблема может заключаться в следующем: https://github.com/gradle/gradle/issues/2489.

По сути, выходные каталоги изменились в Gradle 4.0, поэтому, если они у вас жестко запрограммированы, выполнение не удастся.

Решение - заменить:

bootRun {
   dependsOn pathingJar
   doFirst {
      classpath = files("$buildDir/classes/main", "$buildDir/resources/main", pathingJar.archivePath)
   }
}

by:

bootRun {
   dependsOn pathingJar
   doFirst {
      classpath = files(sourceSets.main.output.files, pathingJar.archivePath)
   }
}
person Jefferson Lima    schedule 01.12.2020

Я забыл добавить String[] args в основной метод public static void main()

После смены на public static void main(String[] args) все заработало.

Мой build.gradle выглядит так

apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'hugo.HelloWorld'

FOld Stru

person Sachin Mohan    schedule 23.07.2021