【问题标题】:java 1.8 - gradle can't find main classjava 1.8 - gradle找不到主类
【发布时间】:2017-11-11 16:53:51
【问题描述】:

我正在尝试使用 gradlew 运行 gradle 构建。我的文件夹结构如下所示:

src
└── main
    └── java
        └── hello
            └── Greeting.java

这是我的 build.gradle

    buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.8.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

mainClassName = 'hello.Greeting'
sourceSets.main.java.srcDirs = ['src']


jar {
    baseName = 'gs-rest-service'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

我可以成功运行 ./gradlew build,但 ./gradlew run 退出时:

 Task :run
 Error: Could not find or load main class hello.Greeting

Greeting.java 只是一个带有 main 方法的简单类:

package main.java.hello;


public class Greeting {

    public static void main(String[] args) {
        System.out.println("greet");
    }

}

【问题讨论】:

  • 你能告诉我们你的主类(Greeting.java)源代码吗?
  • 我怀疑你的 java 构建路径。 Jre 无法识别您的主要课程。 ?
  • @adarshr 我更新了我的问题以显示主类。

标签: java class gradle build.gradle gradlew


【解决方案1】:

您的包裹不正确。将其更改为package hello; 即可。

src/main/java 是源文件夹,它不是包的一部分。

【讨论】:

  • 你能说得更具体些吗?
  • 您的意思是将包 main.java.hello 更改为仅包 hello 吗?因为如果我这样做,那么当我在 IDE 中运行时会发生这种情况:错误:无法找到或加载主类 main.java.hello.Greeting
  • 通过定义 sourceSets.main.java.srcDirs = ['src'] 您将源路径设置为指定文件夹。这意味着 Hello 类中的 Package 必须是“package main.hello.java”。解决问题的真正方法是:从构建文件中删除 sourceSet 定义。通过调用“gradle cleanEclipse eclipse”再次生成eclipse项目文件,并将类中的包设置为“package hello;”按照 adarshr 的建议。您还必须匹配 mainClassName 的包名称。在您的示例中,这必须是“mainClassName=main.hello.java.Greeting”
【解决方案2】:

从 java 文件中的包定义中删除 main 或 删除不一致的 SourceSet 定义或将其更改为

sourceSets {
   main {
     java {
       exclude 'some/unwanted/package/**'
     }
   }
 }

【讨论】:

    【解决方案3】:

    我更改了我的目录结构,但如果应用了以下规则,则没有必要这样做。

    src
    └── hello
        └── main
            └── java
                └── Greeting.java
    

  • 需要指定正确的sourceSet结构
  • sourceSets {
        hello{
            main {
                java {
                    srcDir 'src/hello/main/java'
                }
            }
        }
    }
    

    请注意,路径必须与源集结构相同。

    定义主类名:

  • 必须引用其中一个源集
  • mainClassName='hello.main.java.Greeting'
    

    但也可以是:

    mainClassName='hello.main.java.x.y.Greeting'
    

    ,如果我们想在包中添加一些文件夹。

    【讨论】:

    • 这都是错误的。您只需要按照我在回答中的说明修复包名称即可。
    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多