Почему Gradle пытается найти пакет ресурсов для моего проекта?

Я пытаюсь отследить проблему с многопроектной сборкой. Я сократил свою проблему до довольно простой настройки.


Информация о Gradle

------------------------------------------------------------
Gradle 3.2.1
------------------------------------------------------------

Build time:   2016-11-22 15:19:54 UTC
Revision:     83b485b914fd4f335ad0e66af9d14aad458d2cc5

Groovy:       2.4.7
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.7.0_40 (Oracle Corporation 24.0-b56)
OS:           Linux 2.6.32-642.11.1.el6.i686 i386

Структура каталогов

  • root/
    • HelloWorld/
      • src/
        • com.dishbreak.testlab
          • HelloWorld.java
    • настройки .градле
    • build.gradle

Примечание. Я не использую Maven SDL, потому что устаревший проект, который я пытаюсь реализовать, не использует его.


HelloWorld.java

package com.dishbreak.testlab;

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello world!");

    }

}

настройки .градле

include ":HelloWorld"

build.gradle

subprojects {
    apply plugin: "java"
    sourceSets {
        main {
            java {
                srcDirs = ['src/']
            }
        }
    }
    compileJava {
        options.verbose = true
    }
}

Вывод команды

[admin@box Plugins]$ gradle build
:HelloWorld:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':HelloWorld:compileJava'.
> Cannot find javac resource bundle for locale en_US

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 0.87 secs

Для справки, попытка с флагом --info дает мне следующий соответствующий вывод?

20:26:07.077 [INFO] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Executing task ':HelloWorld:compileJava' (up-to-date check took 0.002 secs) due to:
  No history is available.
20:26:07.077 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':HelloWorld:compileJava'.
20:26:07.077 [INFO] [org.gradle.api.internal.changedetection.changes.RebuildIncrementalTaskInputs] All input files are considered out-of-date for incremental task ':HelloWorld:compileJava'.
20:26:07.077 [DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments: -source 1.7 -target 1.7 -d /redacted/root/HelloWorld/build/classes/main -verbose -g /redacted/root/HelloWorld/src/com/dishbreak/testlab/HelloWorld.java -XDuseUnsharedTable=true
20:26:07.078 [INFO] [org.gradle.api.internal.tasks.compile.JdkJavaCompiler] Compiling with JDK Java compiler API.
20:26:07.078 [DEBUG] [org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter] Removed task artifact state for {} from context.
20:26:07.078 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':HelloWorld:compileJava'
20:26:07.079 [LIFECYCLE] [class org.gradle.internal.buildevents.TaskExecutionLogger] :HelloWorld:compileJava FAILED

Ради любопытства я попытался запустить команду javac напрямую, и она действительно создает файл класса, который запускается!

[admin@box HelloWorld]$ javac -source 1.7 -target 1.7 -d /redacted/root/HelloWorld/build/classes/main -verbose -g /redacted/root/HelloWorld/src/com/dishbreak/testlab/HelloWorld.java -XDuseUnsharedTable=true
[parsing started RegularFileObject[/redacted/root/HelloWorld/src/com/dishbreak/testlab/HelloWorld.java]]
[parsing completed 14ms]
[search path for source files: .]
[search path for class files: /opt/java/jdk1.7.0_40/jre/lib/resources.jar,/opt/java/jdk1.7.0_40/jre/lib/rt.jar,/opt/java/jdk1.7.0_40/jre/lib/sunrsasign.jar,/opt/java/jdk1.7.0_40/jre/lib/jsse.jar,/opt/java/jdk1.7.0_40/jre/lib/jce.jar,/opt/java/jdk1.7.0_40/jre/lib/charsets.jar,/opt/java/jdk1.7.0_40/jre/lib/jfr.jar,/opt/java/jdk1.7.0_40/jre/classes,/opt/java/jdk1.7.0_40/jre/lib/ext/sunjce_provider.jar,/opt/java/jdk1.7.0_40/jre/lib/ext/sunpkcs11.jar,/opt/java/jdk1.7.0_40/jre/lib/ext/localedata.jar,/opt/java/jdk1.7.0_40/jre/lib/ext/zipfs.jar,/opt/java/jdk1.7.0_40/jre/lib/ext/sunec.jar,/opt/java/jdk1.7.0_40/jre/lib/ext/dnsns.jar,.]
[loading ZipFileIndexFileObject[/opt/java/jdk1.7.0_40/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[loading ZipFileIndexFileObject[/opt/java/jdk1.7.0_40/lib/ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
[checking com.dishbreak.testlab.HelloWorld]
[loading ZipFileIndexFileObject[/opt/java/jdk1.7.0_40/lib/ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
[loading ZipFileIndexFileObject[/opt/java/jdk1.7.0_40/lib/ct.sym(META-INF/sym/rt.jar/java/lang/System.class)]]
[loading ZipFileIndexFileObject[/opt/java/jdk1.7.0_40/lib/ct.sym(META-INF/sym/rt.jar/java/io/PrintStream.class)]]
[loading ZipFileIndexFileObject[/opt/java/jdk1.7.0_40/lib/ct.sym(META-INF/sym/rt.jar/java/io/FilterOutputStream.class)]]
[loading ZipFileIndexFileObject[/opt/java/jdk1.7.0_40/lib/ct.sym(META-INF/sym/rt.jar/java/io/OutputStream.class)]]
[wrote RegularFileObject[/redacted/root/HelloWorld/build/classes/main/com/dishbreak/testlab/HelloWorld.class]]

И когда я пытаюсь запустить файл класса, который я скомпилировал автоматически?

[admin@box root]$ java -cp HelloWorld/build/classes/main/ com.dishbreak.testlab.HelloWorld
Hello world!

Несколько вопросов...

  • Почему подробный вывод задачи компиляции ничего не дает мне в Gradle?
  • Почему Gradle запрашивает пакет ресурсов, когда мой код его не использует?
  • Почему команда javac работает, когда я ввожу ее напрямую?
  • Есть ли что-то еще, что мне нужно сделать, так как я не использую Maven SDL?

person Vishal Kotcherlakota    schedule 24.01.2017    source источник
comment
если у вас нет действительно очень веской причины, пожалуйста, придерживайтесь очень разумных соглашений о каталогах gradle (и maven). src/main/java для Java src/main/resources для ресурсов (также src/test/java, src/test/resrouces)   -  person lance-java    schedule 24.01.2017
comment
Я согласен! В моем случае причина в том, что перетасовка более 20 задействованных проектов нарушит существующие задачи сборки Ant, от которых зависят мои файлы Gradle. :) Я выбрал Gradle вместо Maven именно потому, что понял, что Gradle более гибок в отношении структуры каталогов. Я понимаю, что отказ от стандартной структуры открывает для меня больше работы, но перемещение устаревшего проекта в новую структуру каталогов, потому что инструмент сборки считает это разумным, просто не имеет большого смысла для меня.   -  person Vishal Kotcherlakota    schedule 24.01.2017
comment
Это достаточно веская причина, и Gradle, безусловно, может адаптироваться к вашим потребностям. Где вы тогда храните свои ресурсы? (например, XML-файлы). Они перепутаны с вашими источниками Java?   -  person lance-java    schedule 25.01.2017
comment
Что меня смущает, так это то, что конкретный проект не имеет никаких ресурсов - это более или менее оболочка для некоторого кода, сгенерированного WSDL. Учитывает ли Gradle ресурсы WSDL?   -  person Vishal Kotcherlakota    schedule 25.01.2017


Ответы (1)


Вы можете добавить это как одноуровневое в блок сценария java

resources {
    filter {
        return it.exists()
    }
}
person Meme Composer    schedule 24.01.2017
comment
Интересно. Как это помогает? - person Vishal Kotcherlakota; 24.01.2017
comment
Он отфильтровывает все, чего нет - person Meme Composer; 24.01.2017
comment
Я это понимаю. :-) Я должен быть более конкретным. Я не понимаю, зачем мне это нужно, когда ни один другой проект, который я делал, не нуждался в таком блоке ресурсов. Не пытаюсь быть сложным, просто пытаюсь понять, почему. - person Vishal Kotcherlakota; 24.01.2017
comment
Это просто град. Предполагается, что структура вашего проекта соответствует соглашению о структуре проекта maven src/main/java для исходного кода и src/main/resources для ресурсов, отличных от Java. Вы должны быть явными, если хотите другую структуру - person Meme Composer; 24.01.2017