8

Compilando il mio programma contro javaee-api. Ma per il test di Junit devo usare un'implementazione specifica come javaee.jar di glassfish per evitare errori come java.lang.ClassFormatError: attributo Absent Code nel metodo che non è nativo o astratto nel file di classe javax/persistence/Persistenza (vedere anche 1).Come posso utilizzare JAR diversi per la compilazione e il test in Maven?

Quindi evitare l'uso di metodi, che sono disponibili solo nell'implementazione di glassfish, voglio compilare il mio artefatto con l'api generale, ma eseguire junit con il jar di implementazione. Ma entrambi forniscono classi con nome uguale e inferfanti, quindi il caricatore di classi si mette nei guai.

Qual è il modo migliore per risolvere questo problema? Posso risolvere questo problema con Maven?

Grazie mille

risposta

13

Penso che sia possibile. In realtà, a partire dalla versione 2.0.9, Maven usa l'ordine POM per costruire il classpath, quindi puoi manipolarlo ora. E se si combina questo con Dependency Scope, dovrebbe essere possibile ottenere ciò che si desidera. In termini pratici, se si inserisce la dipendenza javaee di GlassFish (con uno test prima dello della dipendenza javaee-api, il primo deve essere inserito prima nel successivo classpath di prova e quindi utilizzato dai test di unità mentre il successivo verrà utilizzato durante compilare. In teoria, dovrebbe funzionare, ma è un po 'fragile quindi deve essere attentamente documentato.

Qualcosa del genere (con un vaso GFv3 fittizio):

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

vedere http://stackoverflow.com/questions/793054/maven-classpath-order-issues~~V~~singular~~3rd anche – marabol

+0

sto usando mvn 2.2. 1, ma il tuo suggerimento non funziona. Ho provato \t JavaEE \t JavaEE-api \t 5-GlassFish-v2.1-b60e \t prova \t JavaEE \t JavaEE-api \t \t fornito 5-GlassFish-v2.1-b60e è la mia versione locale forniti da GlassFish 2.1 b60e – marabol

+0

@marabol Cosa non funziona esattamente? –