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属性尝试了各种方法,但是似乎没有任何效果。

Answers:


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

只是为了让刚开始尝试从Netbeans运行gradle项目的新手清楚:
要了解这一点,您需要查看主类名称的外观在构建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 {清单{属性}}位对您有所帮助。谢谢!
保罗

在Gradle似乎运行不同的情况下,Netbeans有何不同之处?我正在手动尝试这样做,以便可以更好地了解Gradle。Netbeans似乎真的很擅长Maven,但是Gradle在Netbeans中似乎很脆弱。
cody.tv.weber

2

经历了一段时间的相同问题。但是在创建目录结构src / main / java并将源(从程序包的顶部)放入后,它按预期工作。

我尝试过的教程。执行完之后gradle build,您将必须能够classesbuild目录下找到。


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用Kotlin编写类,则另一个问题可能是您必须将其引用为mainClassName = "hello.WorldKt"

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

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

0

我通过运行gradle build清理(或手动删除gradle build文件夹)来解决此问题

如果将主类移至新程序包,而旧主类仍在claspath中引用,则会发生这种情况


1
build / clean + build / build确实构建build无法解决运行时问题
MonoThreaded

0

当我遇到此错误时,是因为我的课程没有放在包中。把你的HelloWorld.java文件放在“包”文件夹中。您可能必须创建一个新的软件包文件夹:

右键单击该hello文件夹,然后选择“新建”>“包”。然后给它起一个名字(例如:com.example),并将您的HelloWorld.java类移到包中。


0
  1. 验证gradle.properties定义了一个JAVA_HOVE

    org.gradle.java.home = C:\ Program Files(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'

欢迎来到!请编辑您的问题,并详细说明您的解决方案为何有效,即您到底在做什么。
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)
   }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.