2013-04-25 7 views
10

Ho questa classe di testÈ possibile sostituire la versione dell'implementazione JAXB in Java JRE 1.6 SE?

import javax.xml.bind.annotation.XmlElement; 

class CompileTest { 

    void foo(@XmlElement String in) { 
    } 

} 

mia versione java è

$ java -version 
java version "1.6.0_23" 
Java(TM) SE Runtime Environment (build 1.6.0_23-b05) 
Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing) 

e quando provo a compilare quella classe mi sto

javac CompileTest.java 
CompileTest.java:5: annotation type not applicable to this kind of declaration 
    void foo(@XmlElement String in) { 
      ^
1 error 

e questo è valido per Java 6 Quando ho provato ad aggiungere la nuova libreria JAXB al percorso della classe, non è stato d'aiuto. C'è un modo per risolvere questo?

javac -cp jaxb-api-2.2.4.jar CompileTest.java 
+0

L'errore è del compilatore, in effetti, da un diverso (più recente) versione della lingua. Quindi la sostituzione del barattolo non avrà alcun effetto. Solo curioso, perché non usi Java 6? – talonx

+0

Non capisco. "... da una diversa (nuova) versione del linguaggio ...", cosa? "Solo curioso, perché non usi Java 6?" Io sono, forse dovrebbe essere Java 7, è perché non possiamo migrare da 6 a 7, mentre in realtà c'è Java 6 in produzione ... – Betlista

+0

@Betlista - Domanda simile e una soluzione è su http://stackoverflow.com/ domande/8211420/xmlelement-annotation-dissallowed-with-webparam –

risposta

11

Utilizzare il Java approvato Standards Override Meccanismo

Metti la tua directory jaxb-api-2.2.4.jar all'interno <java-home>\lib\endorsed.

Oppure, utilizzare i -D java.endorsed.dirs opzione

javac -Djava.endorsed.dirs=/your/path/to/jaxb-directory CompileTest.java

Riferimenti:
http://docs.oracle.com/javase/6/docs/technotes/guides/standards/

+0

Mi piace il parametro java.endorsed.dirs, perché non ho bisogno di modificare l'installazione di java per tutti gli ap pliche ... – Betlista

2

Può essere applicato solo su campo o metodo, non su parametro metodo. Vedere

@Retention(RUNTIME) @Target({FIELD, METHOD}) 
public @interface XmlElement { 

Edit: Fonte di XmlElement (JDK 1.6.0_18)

* @since JAXB2.0 
* @version $Revision: 1.19 $ 
*/ 

@Retention(RUNTIME) @Target({FIELD, METHOD}) 
public @interface XmlElement { 

Quindi quello che vedo è 1.6.0_18 versione ha XmlElement di 1,19 revisione avere solo FIELD e METHOD destinazione disponibili.

Modifica: Quindi il tuo problema è jdk 1.6 XmlElement non è lo stesso di jaxb.2.2. è possibile controllare la fonte a http://grepcode.com/file/repo1.maven.org/maven2/javax.xml.bind/jaxb-api/2.2.4/javax/xml/bind/annotation/XmlElement.java?av=f

+0

Come ho scritto "... è valido per Java 6 ...", "... Ho provato ad aggiungere la nuova libreria JAXB al percorso della classe ...", dove target è' @Target ({FIELD, METHOD, PARAMETER}) '. – Betlista

+0

@harsh - In Java 6, è dichiarato @Target (valore = {FIELD, METHOD, PARAMETER}). Vedere http: // docs. oracle.com/javaee/6/api/javax/xml/bind/annotation/XmlElement.html –

+0

Questo è esattamente il motivo per cui sto chiedendo come usare la classe da 'jaxb-api-2.2.4.jar' con Java 6 se è anche possibile – Betlista

4

Utilizzare il concetto di cartella "librerie approvate". Date un'occhiata qui: How can I make Ant use JAXB x instead of Java 6 SE JAXB classes ...

Fondamentalmente questo è un modo per indicare a JRE di utilizzare una versione più recente di JAXB.

Si può leggere di più qui: Unofficial guide to JAXB: Using JAXB 2 with SE 6 vedere anche questa domanda: What is the exact way to use endorsed directory in JRE 6

+0

Penso che la risposta di Ravi sia migliore della mia - per favore preferisci votare @ Ravi - I did! – GrahamMc

Problemi correlati