【问题标题】:Gradle - Could not find or load main classGradle - 无法找到或加载主类
【发布时间】:2014-09-15 11:46:01
【问题描述】:

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

【问题讨论】:

    标签: java spring gradle build.gradle


    【解决方案1】:

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

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

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

      mainClassName = "hello.HelloWorld"
      

    【讨论】:

    • 在哪里更改源集?在我的 build.gradle 文件中?或者是否有我需要更改的配置文件?
    • 当我添加 sourceSets.main.java.srcDirs = ['src'] 时,jar 任务中出现错误
    • MissingPropertyException: Could not set unknown property 'mainClassName' 对于 Gradlew 4.1
    • @fuat 你需要有应用插件
    【解决方案2】:

    修改 build.gradle 以将您的主类放入清单中:

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

    【讨论】:

      【解决方案3】:

      我刚刚遇到这个问题并决定自己调试它,因为我在互联网上找不到解决方案。 我所做的只是将 mainClassName 更改为它的整个路径(在项目 ofc 中使用正确的子目录)

          mainClassName = 'main.java.hello.HelloWorld'
      

      我知道这篇帖子发布已经快一年了,但我想有人会发现这些信息很有用。

      编码愉快。

      【讨论】:

        【解决方案4】:

        只是为了让试图从 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'
        }
        

        【讨论】:

        • 对我来说,添加你的 jar { manifest { attributes } } 位会有所帮助。谢谢!
        • Netbeans 在 Gradle 的运行方式上有何不同?我正在手动尝试此操作,以便更好地理解 Gradle。 Netbeans 似乎非常擅长 Maven,但 Gradle 在 Netbeans 中似乎很脆弱。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 另外,由于没有其他人指定它:build.gradle 文件必须位于“旁边”src/ 目录,而不是与 src/main/java/hello/ 中的 .java 文件一起放置
          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            如果您决定在 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】:

              我通过运行 clean of gradle build 解决了这个问题(或手动删除 gradle build 文件夹)

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

              【讨论】:

              • build/clean + build/build does build build 不能修复运行时问题
              【解决方案10】:

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

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

              【讨论】:

                【解决方案11】:
                1. 验证gradle.properties是否定义了正确的一个JAVA_HOVE

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

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

                【讨论】:

                  【解决方案12】:

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

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

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

                  【讨论】:

                  • 这已经是springboot项目启动的入口点,问题是配置冲突而不是如何启动项目
                  【解决方案13】:

                  对于像这样的项目结构

                  project_name/src/main/java/Main_File.class
                  

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

                  mainClassName = 'Main_File'
                  

                  【讨论】:

                  • 欢迎来到 SO!。请编辑您的问题并详细说明您的解决方案为何有效,即您到底在做什么。
                  【解决方案14】:

                  如果您使用的是 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)
                     }
                  }
                  

                  【讨论】:

                    【解决方案15】:

                    我忘记在 main 方法 public static void main() 中添加 String[] args

                    将其更改为public static void main(String[] args) 后,一切正常。

                    我的build.gradle 看起来像这样

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

                    【讨论】:

                      猜你喜欢
                      • 2018-09-12
                      • 2021-09-18
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-01-21
                      • 2018-12-02
                      • 2021-12-18
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多