#java #gradle #build
#java #gradle #сборка
Вопрос:
У меня есть глупо простая программа HelloWorld, которая работает, если я не использую Gradle sourceSet, но терпит неудачу, если я использую. Я не могу понять, почему. Пожалуйста, помогите.
Использование 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());
}
}
build.gradle без sourceSet:
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
Модифицированный build.gradle с помощью sourceSet:
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. просто удалите
sourceSets
блок из вашего второгоbuild.gradle
скрипта: по умолчанию Gradle будет использоватьсяsrc/main/java
в качестве базового каталога дляmain
sourceSet. почему вы пытаетесь принудительно использовать этот каталогsrc/
(вы уже переместили свойsrc/main/java
исходный файл, как и ожидалось)2. @M.Ricciuti Спасибо. Я не могу поверить, что это была проблема все время. Я бы хотел, чтобы документация по Gradle и ее примерам была немного лучше!
Ответ №1:
Как указал @M.Ricciuti, мне просто нужно было удалить блок sourceSets из второго скрипта build.gradle. По умолчанию Gradle будет использовать src /main / java в качестве базового каталога для основного исходного набора, без необходимости его явного объявления. (Я не знал об этом.)