Gradle - 无法找到或加载主类

时间:2014-07-24 04:05:29

标签: java spring gradle build.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属性尝试了各种各样的东西,但似乎没有任何效果。

13 个答案:

答案 0 :(得分:59)

我在这里看到两个问题,一个问题sourceSet另一个问题mainClassName

  1. 将java源文件移至src/main/java而不是src。或者通过将以下内容添加到build.gradle来正确设置sourceSet

    sourceSets.main.java.srcDirs = ['src']
    
  2. mainClassName应该是完全限定的类名,而不是路径。

    mainClassName = "hello.HelloWorld"
    

答案 1 :(得分:7)

只是为了让新手试图从Netbeans运行一个gradle项目: 要理解这一点,您需要查看主要类名称的内容 gradle构建的内容:

主要课程:

package com.stormtrident;

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

请注意,它是包" com.stormtrident"的一部分。

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

答案 2 :(得分:1)

在一段时间内遇到同样的问题。但是在创建目录结构src / main / java并放入源代码(从包的顶部)之后,它按预期工作。

我试过的tutorial。执行gradle build后,您必须能够在classes目录下找到build

答案 3 :(得分:1)

在我的build.gradle中,我通过创建一个任务然后指定" mainClassName"解决了这个问题。如下:

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

答案 4 :(得分:1)

我通过在我的应用程序中添加以下代码来解决它。

//在此处输入代码 这是我运行build.gradle时遇到的错误。主类名称尚未配置,无法解析

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

答案 5 :(得分:0)

我通过运行gradle build(或者手动删除gradle build文件夹)来修复此问题

如果将主类移动到新包并且仍然在claspath中引用旧的主类,则会发生这种情况

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

  1. 验证 gradle.properties 是否正确定义了一个JAVA_HOVE

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

  1. 如果未定义,请确保Eclipse是否知道JDK而不是JRE

enter image description here

答案 8 :(得分:0)

如果您决定在Kotlin中编写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

答案 9 :(得分:0)

对于像这样的项目结构

project_name/src/main/java/Main_File.class

在文件build.gradle中,添加以下行

mainClassName = 'Main_File'

答案 10 :(得分:0)

对于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

答案 11 :(得分:0)

如果您使用的是Spring Boot,则可能是以下问题:target

基本上,输出目录在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)
   }
}

答案 12 :(得分:0)

我忘记在主方法 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