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

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

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

Каков наилучший способ решить эту проблему? Могу ли я решить эту проблему с помощью maven?

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


person marabol    schedule 22.01.2010    source источник


Ответы (1)


Я думаю, что это возможно. На самом деле, начиная с версии 2.0.9, Maven использует порядок POM для построения пути к классам, поэтому теперь вы можете манипулировать им. И если вы объедините это с Dependency Scope, должно быть возможно достичь того, чего вы хотите. С практической точки зрения, если вы поместите зависимость GlassFish javaee (с областью действия test) перед зависимостью 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>
person Pascal Thivent    schedule 22.01.2010
comment
Я использую mvn 2.2.1, но ваше предложение не работает. Я пробовал ‹dependency› ‹groupId›javaee‹/groupId› ‹artifactId›javaee-api‹/artifactId› ‹version›5-glassfish-v2.1-b60e‹/version› ‹scope›test‹/scope› ‹ /dependency› ‹dependency› ‹groupId›javaee‹/groupId› ‹artifactId›javaee-api‹/artifactId› ‹version›5‹/версия› ‹scope›предоставляется‹/scope› ‹/dependency› 5-glassfish-v2. 1-b60e — моя локальная версия, предоставленная Glassfish 2.1 b60e. - person marabol; 05.02.2010
comment
Это была моя вина... Groupid и/или ArtiftId должны отличаться! - person marabol; 05.02.2010
comment
Maven использует последнюю конфигурацию для groupId:artifactId, настроенную в одном poim.xml. Поэтому, если вы сначала настроите область действия, предоставленную с версией 5, а затем с тем же тестом scrope groupId:artifactId с версией 5-my-glassfish, maven создаст эффективный pom только со вторым. - person marabol; 05.02.2010
comment
@marabol Спасибо за отзыв. Это очень особый вариант использования, но это похоже на ошибку Maven. - person Pascal Thivent; 05.02.2010