Исключить зависимость Maven во время выполнения приложения Eclipse - PullRequest
0 голосов
/ 11 января 2019

Когда я пытаюсь запустить приложение Java на Eclipse, конфликт между двумя зависимостями вызывает сбой приложения.

Я пытаюсь обновить версию Java своего проекта с OracleJDK 8 до OpenJDK 11. В результате мне также пришлось обновить GWT-зависимость с 2.6.0 до 2.8.2, а также перейти с MOJO gwt -maven-плагин к версии tboyer. Кроме того, сборка выполняется на Maven 4.0.0 в Eclipse IDE 4.9.0.

Фрагмент pom.xml

<properties>
  <gwt.version>2.8.2</gwt.version>
  ...
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.google.gwt</groupId>
      <artifactId>gwt</artifactId>
      <version>${gwt.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>com.google.gwt</groupId>
    <artifactId>gwt-dev</artifactId>
    <scope>provided</scope>
  </dependency>    
  ...

<build>
  <plugins>
    <plugin>
      <groupId>net.ltgt.gwt.maven</groupId>
      <artifactId>gwt-maven-plugin</artifactId>
      <version>1.0-rc-10</version>
      <executions>
        <execution>
          <id>compile-common</id>
          <goals>
            <goal>compile</goal>
            <goal>test</goal>
          </goals>
          <configuration>
            <moduleName>XXXXModule</moduleName>
          </configuration>
       </execution>
       <execution>
         <id>XXXX</id>
         <goals>
           <goal>compile</goal>
           <goal>test</goal>
         </goals>
         <configuration>
           <moduleName>XXXXModule</moduleName>
         </configuration>
       </execution>
       <execution>
         <id>XXXX</id>
         <goals>
           <goal>compile</goal>
           <goal>test</goal>
         </goals>
         <configuration>
           <moduleName>XXXXModule</moduleName>
         </configuration>
       </execution>
       <execution>
          <id>XXXX</id>
          <goals>
            <goal>compile</goal>
            <goal>test</goal>
          </goals>
          <configuration>
            <moduleName>XXXXModule</moduleName>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Поэтому, когда я запускаю приложение в Eclipse, я получаю следующую ошибку:

SEVERE: Application encountered an exception during Start.
XXXX.ApplicationException: Failed to reflect on start method.
at XXXX.ApplicationLauncher.startApplication(ApplicationLauncher.java:471)
    at XXXX.ApplicationLauncher.doRun(ApplicationLauncher.java:185)
    at XXXX.ApplicationLauncher.main(ApplicationLauncher.java:67)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at XXXX.ApplicationLauncher.startApplication(ApplicationLauncher.java:469)
    ... 2 more
Caused by: java.lang.NoSuchMethodError: org.apache.tomcat.util.ExceptionUtils.preload()V
    at org.apache.catalina.startup.Tomcat.<init>(Tomcat.java:181)
....

После исследования я обнаружил, что две из моих зависимостей tomcat-embed-core-7.0.91 и apache-jsp-8.0.9.M3 обе содержат ExceptionUtils с несколькими отличиями, отсюда и Exception. Кроме того, apache-jsp извлекается зависимостью gwt-dev, которая требуется только во время сборки Maven для запуска плагина gwt-maven-plugin.

gwt-dev:2.8.2
    apache-jsp:9.2.14.v20151106
         apache-jsp:8.0.9.M3

Но по какой-то причине Eclipse включает в себя gwt-dev и его зависимость как часть пути выполнения, даже если у меня есть «предоставленный» тег области действия в pom.xml.

Я попытался исключить зависимость apache-jsp, но возникает проблема компиляции, потому что очевидно, что gwt-dev все еще добавляется, что зависит от apache-jsp.

Резюме

  • TBroyer GWT-Maven-Plugin требует, чтобы файл pom включал gwt-dev в качестве зависимости для правильной работы во время сборки.
  • Однако при запуске приложения в Eclipse возникает исключение NoSuchMethodException в org.apache.tomcat.util.ExceptionUtils.preload () V
  • Проблема в том, что есть два класса ExceptionUtil с одинаковым пакетом из разных jar-файлов и методов.
  • Одним из jar-файлов является apache-jsp, который зависит от gwt-dev. Gwt-dev и его зависимости не должны быть частью пути к классу времени выполнения.

Вопрос : Есть ли способ убедиться, что gwt-dev используется только во время сборки Maven и не является частью пути к классу времени выполнения приложения Java Eclipse?

1 Ответ

0 голосов
/ 12 января 2019

Да, вы можете обеспечить изолированный путь к классу для клиентской и серверной сторон. Вам необходимо применить многомодульный макет. В этом и заключается главное отличие старого плагина MOJO gwt maven от нового плагина tbroyer gwt maven нового поколения, который правильно поддерживает мультимодуль. Проверьте этот архетип как ссылку для многомодульного макета. Кроме того, используйте пакет: gwt-app для автоматической настройки выполнения подключаемого модуля gwt maven.

Немного сложнее заставить его работать с действием запуска затмения (tomcat или gwt). Пока вы правильно не примените плагин tbroyer gwt maven и многомодульный макет, вы сможете использовать mvn tomcat7:run и mvn gwt:codeserver в терминале. Затем рекомендуется использовать его в своей среде IDE, чтобы настроить эту цель maven и запустить ее, используя инструменты maven вашей среды IDE. Это позволяет ему работать одинаково во всех ваших средах (терминал, CI, eclipse, intellij и т. Д.).

...