我有一个非常简单的helloworld程序,如果我不使用gradlesourceset,它就可以工作,但是如果我使用gradlesourceset,它就会失败。我不明白为什么。请帮忙。
使用gradle 6.6.1-bin。我自己手动安装的,只是为了确保它是兼容的。
问题是,如果我将build.gradle文件和helloworld.java文件放在同一个基本目录中,那么一切都会成功编译和构建。命令示例:
gradle clean build
helloworld.java文件:
package hello;
import org.joda.time.LocalTime;
public class HelloWorld {
public static void main(String[] args) {
LocalTime currentTime = new LocalTime();
System.out.println("The current local time is: " + currentTime);
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
不带sourceset的build.gradle:
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'
mainClassName = 'hello.HelloWorld'
repositories {
mavenCentral()
}
jar {
archiveBaseName = 'gs-gradle'
archiveVersion = '0.1.0'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
implementation "joda-time:joda-time:2.2"
testImplementation "junit:junit:4.12"
}
但是,如果我尝试将源文件移动到文件夹布局(正如gradle指南所建议的那样,这是他们的标准)并添加一个sourceset,则会失败。
文件夹布局如下:
/opt/myproject/src/main/java/helloworld.java
/opt/myproject/build.gradle选项
使用sourceset修改了build.gradle:
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'
sourceSets {
main {
java {
srcDir 'src'
}
}
}
mainClassName = 'hello.HelloWorld'
repositories {
mavenCentral()
}
jar {
archiveBaseName = 'gs-gradle'
archiveVersion = '0.1.0'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
implementation "joda-time:joda-time:2.2"
testImplementation "junit:junit:4.12"
}
现在运行此操作失败:
gradle clean build
控制台输出:
> Task :compileJava FAILED
/opt/myProject/src/main/java/HelloWorld.java:10: error: cannot find symbol
Greeter greeter = new Greeter();
^
symbol: class Greeter
location: class HelloWorld
/opt/myProject/src/main/java/HelloWorld.java:10: error: cannot find symbol
Greeter greeter = new Greeter();
^
symbol: class Greeter
location: class HelloWorld
2 errors
FAILURE: Build failed with an exception.
我不知道为什么这是失败的工作。
1条答案
按热度按时间e7arh2l61#
正如@m.ricciuti指出的,我只需要从第二个build.gradle脚本中删除sourcesets块。默认情况下,gradle将使用src/main/java作为主sourceset的基本目录,而不需要显式声明它(我对此一无所知。)