8 Stimmen

Wie kann ich verschiedene JARs zum Kompilieren und Testen in Maven verwenden?

Ich kompiliere mein Programm gegen javaee-api. Aber für Junit-Tests muss ich eine spezielle Implementierung wie javaee.jar von Glassfish verwenden, um Fehler wie java.lang.ClassFormatError: Fehlendes Code-Attribut in einer Methode, die nicht nativ oder abstrakt ist, in der Klassendatei javax/persistence/Persistence (siehe auch 1 ).

Um die Verwendung von Methoden zu vermeiden, die nur in der Glassfish-Implementierung verfügbar sind, möchte ich mein Artefakt mit der allgemeinen API kompilieren, aber Junit mit dem Implementierungs-Jar ausführen. Aber beide bieten gleich benannte Klassen und Inferfaces, so dass der Klassenlader in Schwierigkeiten gerät.

Wie lässt sich dieses Problem am besten lösen? Kann ich dieses Problem mit Maven lösen?

Herzlichen Dank!

14voto

Pascal Thivent Punkte 548176

Ich denke, dass dies möglich ist. Tatsächlich verwendet Maven ab Version 2.0.9 die POM-Reihenfolge, um den Klassenpfad zu erstellen, so dass Sie ihn jetzt manipulieren können. Und wenn Sie dies kombinieren mit Umfang der Abhängigkeiten sollte es möglich sein, das zu erreichen, was Sie wollen. Praktisch gesehen, wenn Sie GlassFish's javaee Abhängigkeit (mit einem Test Umfang) vor die javaee-api Abhängigkeit sollte die erstere vor der letzteren im Test-Klassenpfad platziert werden und somit von Unit-Tests verwendet werden, während die letztere während der Kompilierung verwendet wird. Theoretisch sollte dies funktionieren, aber es ist etwas anfällig und muss daher sorgfältig dokumentiert werden.

So ähnlich (mit einem fiktiven GFv3-Gefäß):

<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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X