Как я могу использовать разные JAR для компиляции и тестирования в maven? - PullRequest
8 голосов
/ 22 января 2010

Я компилирую свою программу на javaee-api. Но для тестирования Junit я должен использовать конкретную реализацию, такую ​​как javaee.jar из Glassfish, чтобы избежать ошибок, таких как java.lang.ClassFormatError: Атрибут отсутствия кода в методе, который не является нативным или абстрактным в файле класса javax / persistence / Persistence (см. также 1 ).

Поэтому, избегая использования методов, которые доступны только в реализации Glassfish, я хочу скомпилировать мой артефакт с помощью общего API, но запустить Junit с Jar реализации. Но оба предоставляют одинаковые именованные классы и интерфейсы, поэтому загрузчик классов попадает в беду.

Как лучше всего решить эту проблему? Могу ли я решить эту проблему с Maven?

Большое спасибо

1 Ответ

13 голосов
/ 22 января 2010

Я думаю, что это возможно. На самом деле, начиная с версии 2.0.9, Maven использует порядок POM для создания пути к классам, поэтому вы можете манипулировать им сейчас. И если вы объедините это с Dependency Scope , то будет возможно достичь того, чего вы хотите. С практической точки зрения, если вы поместите зависимость javaee GlassFish (с test scope) перед зависимостью javaee-api, первая должна быть помещена перед последней в пути к классу теста таким образом используется модульными тестами, в то время как последний будет использоваться при компиляции. Теоретически, это должно работать, но это довольно хрупко, поэтому его нужно тщательно документировать.

Что-то в этом роде (с вымышленной банкой GFv3):

<dependencies>
  <dependency><!-- this one will be first on the test classpath -->
    <groupId>org.glassfish</groupId>
    <artifactId>javaee</artifactId>
    <version>6.0</version>
    <scope>test</scope>
  <dependency>
  <dependency><!-- this one will be used during compile -->
    <groupId>javax.javaee-api</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
  <dependency>
  ...
</dependencies>
...