Как добавить исходный код в настраиваемый плагин Java Gradle

используя Gradle 4.7

Я хотел бы добавить новый набор исходников для классов интеграции тестов. Отделенный от основного набора исходных текстов тестов, он будет иметь некоторые другие зависимости и иметь отдельную задачу для запуска тестов.

Можно ли это сделать с помощью настраиваемого плагина Java Gradle?

Вот код и проект, который его использует.

https://github.com/gadieichhorn/gradle-java-multimodule/tree/master/buildSrc

поскольку эти тесты используют образ докера, созданный из сборки, он должен запускаться только после сборки, в отличие от обычных тестов.

любой образец или вклад будут оценены.

        project.getPlugins().withType(JavaPlugin.class, javaPlugin -> {

            JavaPluginConvention javaConvention = project.getConvention().getPlugin(JavaPluginConvention.class);

            SourceSet main = javaConvention.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME);
            SourceSet test = javaConvention.getSourceSets().getByName(SourceSet.TEST_SOURCE_SET_NAME);

            final Configuration integrationImplementation = project.getConfigurations().create("integrationImplementation")
                    .setExtendsFrom(Arrays.asList(project.getConfigurations().getByName("testImplementation")))
                    .setVisible(false)
                    .setDescription("Integration Implementation");

            project.getDependencies().add(integrationImplementation.getName(), "org.testcontainers:testcontainers:1.7.1");

            final Configuration integrationRuntimeOnly = project.getConfigurations().create("integrationRuntimeOnly")
                    .setExtendsFrom(Arrays.asList(project.getConfigurations().getByName("testRuntimeOnly")))
                    .setVisible(false)
                    .setDescription("Integration Runtime Only ");

//            project.getDependencies().add(integrationRuntimeOnly.getName(), "org.testcontainers:testcontainers:1.7.1");

            final SourceSet integration = javaConvention.getSourceSets().create("integration", sourceSet -> {
                sourceSet.getJava().srcDir(Arrays.asList("src/integration/java"));
                sourceSet.getResources().srcDir("src/integration/resources");
                sourceSet.setCompileClasspath(project.files(main.getOutput(), test.getOutput()));
                sourceSet.setRuntimeClasspath(project.files(main.getOutput(), test.getOutput()));
                sourceSet.setRuntimeClasspath(sourceSet.getOutput());
            });

            project.getTasks().create("e2e", Test.class, e2e -> {
                e2e.setTestClassesDirs(integration.getOutput().getClassesDirs());
                e2e.setClasspath(integration.getRuntimeClasspath());
            });

        });

Спасибо @ Turing85, но у меня уже есть скрипт gradle, который может это сделать, я бы хотел, чтобы это было в коде плагина Java, поэтому мне не нужно настраивать его для каждого проекта.

Gadi 28.05.2018 23:03

Что-то вроде это?

Turing85 28.05.2018 23:08

не уверен, мне просто нужно правильно установить исходники и добавить некоторые зависимости. остальная часть докеров выполняется в коде тестового класса, а не в плагине. имеет смысл?

Gadi 28.05.2018 23:15

В этом случае, пожалуйста, еще раз проверьте ссылку, которую я разместил. Существует явный пример создания набора источников интеграционных тестов (в разделе «Определение новых наборов источников»).

Turing85 28.05.2018 23:18

это именно то, что я делаю, см. выше. не работает :(

Gadi 29.05.2018 08:34

Я использовал следующий пост, чтобы создать свой собственный плагин integrationTest для моих пользовательских проектов: petrikainulainen.net/programming/gradle/…

M.Ricciuti 16.08.2020 18:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
7
1 838
1

Ответы 1

Я добавил новый sourceSet с помощью groovy - надеюсь, он может служить ссылкой для Java-эквивалента, который вы пытаетесь использовать. Подумайте о написании самого плагина на Groovy.

class CustomPlugin implements Plugin<Project> {
  @Override
  void apply(final Project project) {   
        // add a source set
        File sourcesDir = project.file("/some/path")    
        project.sourceSets {
          myNewEndToEndTest {
            java.srcDirs += [sourcesDir]
          }
        }

        project.configurations.create('yourNewConfig')
        project.dependencies {
            // Add some dependencies here that your e2e test run needs
            // Example: yourNewConfig "org.junit:junit-core:5.0"
        }              
        // you can also use the project object to create tasks, taskDependencies, configurations etc
  }

}

Другие вопросы по теме