Gradle - Не вдалося знайти або завантажити основний клас


77

Я намагаюся запустити дуже простий проект за допомогою 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, але, здається, нічого не працює.

Відповіді:


75

Я бачу тут дві проблеми, одна з sourceSetіншою mainClassName.

  1. Або перемістіть вихідні файли Java src/main/javaзамість просто src. Або встановіть sourceSetправильно, додавши наступне до build.gradle.

    sourceSets.main.java.srcDirs = ['src']
    
  2. mainClassName має мати повну назву класу, а не шлях.

    mainClassName = "hello.HelloWorld"
    

Де я можу змінити sourceSets? У моєму файлі build.gradle? Або є файл конфігурації, який мені потрібно змінити?
kibowki

2
Коли я додаю, sourceSets.main.java.srcDirs = ['src']я отримую помилку у завданні jar
Victor M Herasme Perez

MissingPropertyException: Could not set unknown property 'mainClassName'для Gradlew 4.1
fuat

30

Змініть build.gradle, щоб розмістити ваш основний клас у маніфесті:

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

21

Я просто зіткнувся з цією проблемою і вирішив її самостійно налагодити, оскільки не міг знайти рішення в Інтернеті. Все, що я зробив, це змінити mainClassName на весь шлях (з правильними підкаталогами в проекті c)

    mainClassName = 'main.java.hello.HelloWorld'

Я знаю, що з моменту публікації минув майже рік, але я думаю, що комусь ця інформація стане корисною.

Щасливого кодування.


10

Просто для того, щоб було зрозуміло для початківців, які намагаються запустити проект 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'
}

1
Для мене допоміг біт вашого jar {manifest {attributes}}. Дякую!
Пол

Що робить Netbeans інакше, ніж Gradle, здається, працює по-іншому? Я намагаюся зробити це вручну, щоб я міг краще зрозуміти Gradle. Netbeans, здається, дійсно добре володіє Maven, але Gradle, здається, неміцний у Netbeans.
cody.tv.weber

2

Деякий час боровся з тією ж проблемою. Але після створення структури каталогів src / main / java та розміщення джерела (зверху пакета), він працював, як очікувалося.

Підручник я спробував с. Після того, як ви виконаєте gradle build, вам доведеться мати змогу знайти classesв buildкаталозі.


1
Крім того, оскільки ніхто інший його не вказує: build.gradleфайл повинен знаходитись «поряд» з src/каталогом, а не разом із файлами .java вsrc/main/java/hello/
joakimk

2

Для користувачів 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

1

У своєму build.gradle я вирішив цю проблему, створивши завдання, а потім вказавши "mainClassName" наступним чином:

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

1

Якщо ви вирішили написати свій hello.Worldклас у Котліні, іншою проблемою може бути те, що вам доведеться посилатися на нього як mainClassName = "hello.WorldKt".

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

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

0

Я виправив це, запустивши очищення by by gradle build (або щорічно видаляю папку gradle build)

Це відбувається, якщо ви переміщуєте основний клас до нового пакету, а на старий основний клас все ще посилаються в claspath


1
build / clean + build / build робить build build не виправляє проблему виконання
MonoThreaded

0

Коли у мене сталася ця помилка, це було тому, що у мене не було свого класу в пакеті . Помістіть HelloWorld.javaфайл у папку "пакет". Можливо, вам доведеться створити нову папку пакета:

Клацніть правою кнопкою миші на helloпапці та виберіть "Новий"> "Пакет". Потім дайте йому ім’я (наприклад: com.example) і перемістіть свій HelloWorld.javaклас у пакет.


0
  1. перевірити, чи gradle.properties визначив правильний JAVA_HOVE

    org.gradle.java.home = C: \ Файли програм (x86) \ Java \ jdk1.8.0_181

або

  1. якщо це не визначено, переконайтеся, що Eclipse знає JDK, а не JRE

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


0

Я вирішив це, додавши код нижче до моєї програми.

// тут вводимо код, це помилка, яку я отримував під час запуску build.gradle. ім'я основного класу не налаштовано, і його не вдалося вирішити

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

Це вже точка входу для запуску проекту springboot, і питання полягає в конфліктах конфігурації, а не в тому, як ініціювати проект
aya salama

0

Для структури проекту типу

project_name/src/main/java/Main_File.class

у файл build.gradle, додайте наступний рядок

mainClassName = 'Main_File'

Ласкаво просимо до SO !. Будь ласка, відредагуйте своє запитання та трохи детальніше розкажіть, чому ваше рішення працює, тобто що саме ви робите.
B - rian

0

Якщо ви використовуєте 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)
   }
}

від:

bootRun {
   dependsOn pathingJar
   doFirst {
      classpath = files(sourceSets.main.output.files, pathingJar.archivePath)
   }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.