Расширение Maven и Java

Я пытаюсь создать и протестировать приложение JavaFX на автономном сервере сборки. Локально я использую TestFX и Monocle https://github.com/TestFX/Monocle, и все работает нормально . Однако мне пришлось вручную установить Monocle в папку java Extensions в соответствии с этим вопросом: JavaFX + maven + TestFX + monocle не работают вместе

Теперь мне нужно использовать автономный сервер сборки для автоматизации нашего развертывания. Я не могу понять, как правильно установить это расширение Java с помощью Maven, не делая это вручную. Казалось, это правильная функция: https://maven.apache.org/pom.html#Extensions,

<extensions>
    <extension>
        <groupId>org.testfx</groupId>
        <artifactId>openjfx-monocle</artifactId>
        <version>8u76-b04</version>
    </extension>
</extensions>  

но тесты завершаются ошибкой с исключением NoClassDefFoundException (чего не происходит, если я вручную встраиваю банку в расширения). Я не знаю, как это отладить, и правильно ли я использую. Какие-либо предложения?


person Trevor    schedule 24.09.2018    source источник


Ответы (1)


Некоторое время назад у меня была похожая головная боль. Я решил это, скопировав как openjfx-monocle, так и все расширения из папки расширений в папку под /target, а затем установил свойство системы расширений на этот путь. Таким образом я смог избежать NoClassDefFoundException, а также успешно запустить все тесты на Jenkins. Вот часть профиля:

<!--
  This profile is used to make headless tests work with the Monocle Platform.
  It first copies the extensions from the JDK to the target/java-extensions folder.
  Then copies the openjfx-monocle implementation to the same folder.
  Afterwards it sets the extensions path to the folder with the copied extensions and the monocle platform.
-->
<profile>
  <id>headless-tests</id>
  <activation>
    <property>
      <name>headless.tests</name>
      <value>true</value>
    </property>
  </activation>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <executions>

          <execution>
            <id>copy-external-jars</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>target/java-extensions</outputDirectory>
              <resources>
                <resource>
                  <directory>${java.home}/lib/ext/</directory>
                </resource>
              </resources>
            </configuration>

          </execution>

          <execution>
            <id>copy-monocle-to-extensions</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>target/java-extensions</outputDirectory>
              <resources>
                <resource>
                  <directory>src/test/resources/test-lib</directory>
                  <includes>
                    <include>openjfx-monocle-8u76-b04.jar</include>
                  </includes>
                </resource>
              </resources>
            </configuration>
          </execution>

        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.18.1</version>
        <configuration>
          <argLine>-Djava.ext.dirs=${project.basedir}/target/java-extensions</argLine>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>

В моем случае я скопировал банку с моноклем из maven в папку src/test/resources. Это можно улучшить, используя подключаемый модуль зависимостей Maven, чтобы скопировать банку с моноклем напрямую с помощью maven, а не в src/test/resources.

person vl4d1m1r4    schedule 25.09.2018
comment
кажется хорошим решением. Однако для меня в папке расширений есть только openjfx-monocle, в ней нет других JAR, которые нужно было бы скопировать. Интересно, какова настоящая причина этой NoClassDefFound ошибки ... похоже, это не должно исправлять ее, поскольку в этой папке больше ничего нет. Но я попробую, чтобы подтвердить. - person Trevor; 26.09.2018
comment
Это должно работать и в вашем случае, даже если у вас нет других расширений. Причина, по которой вы получаете NoClassDefFoundException, заключается в том, что фабрика обрабатывается в загрузчике классов, который является родительским для загрузчика классов System-Classpath, который используют обычные приложения java / maven. Поэтому, поскольку он сканирует только классы вверх, а платформа монокля не находится в расширениях или в классах времени выполнения, он выдает исключение. Я думаю, что это сработает, просто указав системное свойство папок расширений для папки, которая содержит банку платформы monocle. - person vl4d1m1r4; 26.09.2018