Как я могу настроить плагин maven shadow для включения тестового кода в мою банку?

Я использую плагин Shade maven для сборки своего проекта, чтобы все его зависимости были включены в один jar (это упрощает его запуск в Hadoop). Похоже, Shade по умолчанию исключает мой тестовый код, что понятно. Поскольку я хотел бы запустить интеграционные тесты для своего кластера, я надеюсь настроить другой профиль для создания отдельной банки для этой цели. Есть ли способ настроить этот плагин так, чтобы он также включал тестовый код?


person Patrick Marchwiak    schedule 01.03.2011    source источник
comment
Это скорее обходной путь, чем прямой ответ, но в итоге я добавил цель test-jar в проект, содержащий тесты, и добавил еще одну зависимость от этого проекта (с классификатором «тесты») в мой построенный из сланца проект. Не идеально, но теперь моя сланцевая банка также включает в себя тесты.   -  person Patrick Marchwiak    schedule 01.03.2011
comment
Можете ли вы привести пример того, что вы сделали? Я новичок в maven и не понимаю, как вы добавляете цели в проект или классификаторы в зависимости.   -  person divegeek    schedule 28.10.2011
comment
Добавьте это в раздел сборки pom, чьи тесты вы хотите повторно использовать: <plugin> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <id>test-jar</id> <phase>package</phase> <goals> <goal>test-jar</goal> </goals> </execution> </executions> </plugin> Зависит от этой тестовой банки с классификатором тестов: <dependency> <groupId>com.abc</groupId> <artifactId>blah</artifactId> <version>1.0</version> <classifier>tests</classifier> <scope>test</scope> </dependency>   -  person Patrick Marchwiak    schedule 28.10.2011
comment
@PatrickMarchwiak Не могли бы вы показать, что вы сделали, чтобы решить эту проблему?   -  person Eidan Spiegel    schedule 23.06.2014
comment
Я получил рабочее решение для этой темы с помощью плагина сборки: stackoverflow.com/a/36058365/5606016   -  person A_Di-Matteo    schedule 17.03.2016
comment
Возможный дубликат Как включить тестовые классы в банке, созданной maven-shade-plugin?   -  person gcandal    schedule 17.08.2018


Ответы (5)


В версии 2.2 плагина maven-shade-plugin была добавлена ​​опция «shadeTestJar» (см. MSHADE-158): http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#shadeTestJar

Тем не менее, я пытался использовать это и не мог заставить его работать. Вот мой конфиг плагина:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <shadeTestJar>true</shadeTestJar>
            </configuration>
        </execution>
    </executions>
</plugin>

В файле "...-tests.jar" нет записей, но основной затененный jar выглядит нормально (хотя в нем нет тестовых классов).

Кроме того, этот вопрос дублирует этот другой вопрос, хотя принятый ответ не совсем удовлетворяет: Как включить тестовые классы в Jar, созданные maven-shade-plugin?

person Steve K    schedule 15.08.2014
comment
Я также долго пробовал этот путь, но не мог заставить его работать, вместо этого я использовал плагин сборки, и он работал нормально, проверьте мое решение здесь stackoverflow.com/a/36058365/5606016 - person A_Di-Matteo; 17.03.2016

Эти последние пару ответов в лучшем случае представляют собой запутанные обходные пути для сломанной функции. Дело в том, что в maven-shade-plugin есть ошибка. Тем временем я исследовал и устранил причину ошибки, а также создал заплату. Теперь я надеюсь, что кто-то в Apache скоро включит его, и тогда, наконец, функция shadeTestJar сможет работать так, как должна.

person user23288    schedule 02.04.2018

Мне удалось заставить его работать, добавив:

<plugin>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>build-helper-maven-plugin</artifactId>
     <version>1.9.1</version>
     <executions>

        <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
               <goal>add-source</goal>
            </goals>
            <configuration>
               <sources>
                   <source>${project.basedir}/src/test/java/</source>
               </sources>
            </configuration>
        </execution>

      </executions>
</plugin>
person Dmitry Vasilyev    schedule 24.03.2015
comment
Чтобы это работало, любые тестовые зависимости должны быть сделаны нетестовыми зависимостями. - person user411279; 10.01.2016
comment
Это решение работает для меня. Что касается комментария, любые тестовые зависимости необходимо сделать нетестовыми зависимостями, это можно решить, введя отдельный профиль тени с добавлением всех зависимостей, необходимых для тестовых классов. В противном случае ваш затененный JAR не будет работать. - person dmaidaniuk; 20.04.2018

Попробуйте include создать свои тестовые пакеты следующим образом:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>1.2.2</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <artifactSet>
          <includes>
            <include>org.apache.maven:*</include>
          </includes>
        </artifactSet>
      </configuration>
    </execution>
  </executions>
</plugin>
person Yuriy Nemtsov    schedule 01.03.2011
comment
Я не думаю, что это сработает, если это включение не включает артефакт, включающий тестовый код. Даже тогда мне пришлось бы добавить включение для каждой из моих зависимостей, что является избыточным. - person Patrick Marchwiak; 01.03.2011

Использование maven-shade-plugin, как объяснил ~steve-k выше, правильно, но, к сожалению, из-за ошибки shadeTestJar не работает, и полученный тестовый JAR пуст.

person user23288    schedule 02.04.2018