Come evitare la necessità di specificare la posizione WSDL in un client Webservice generato CXF o JAX-WS?

Quando creo un client Webservice utilizzando wsdl2java da CXF (che genera qualcosa di simile a wsimport), tramite Maven, i miei servizi iniziano con codici come questo:

@WebServiceClient(name = "StatusManagement", wsdlLocation = "c:/some_absolute_path_to_a_wsdl_file.wsdl", targetNamespace = "http://tempuri.org/") public class StatusManagement extends Service { public final static URL WSDL_LOCATION; public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement"); public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus"); static { URL url = null; try { url = new URL("c:/some_absolute_path_to_a_wsdl_file.wsdl"); } catch (MalformsdURLException e) { System.err.println("Can not initialize the default wsdl from c:/some_absolute_path_to_a_wsdl_file.wsdl"); // e.printStackTrace(); } WSDL_LOCATION = url; } 

Il percorso assoluto hardcoded fa davvero schifo. La class generata non funzionerà in nessun altro computer diverso dal mio.

La prima idea è di mettere il file WSDL (più tutto ciò che importa, altri WSDL e XSD) da qualche parte in un file jar e classpath. Ma vogliamo evitare questo. Dal momento che tutto ciò che è stato generato da CXF e JAXB basati su WSDL e XSD, non abbiamo alcun bisogno di conoscere il WSDL in fase di runtime.

L’attributo wsdlLocation è destinato a sovrascrivere il percorso WSDL (almeno questo è ciò che ho letto da qualche parte), e il suo valore predefinito è “”. Poiché utilizziamo Maven, abbiamo cercato di includere all’interno della configurazione di CXF per provare a forzare il generatore di origine a lasciare vuoto wsdlLocation. Tuttavia, questo semplicemente fa ignorare il tag XML perché è vuoto. Abbiamo fatto un brutto " + " vergognoso, usando " + " .

Questo cambia anche in altri posti:

     @WebServiceClient(name = "StatusManagement", wsdlLocation = "" + "", targetNamespace = "http://tempuri.org/") public class StatusManagement extends Service { public final static URL WSDL_LOCATION; public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement"); public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus"); static { URL url = null; try { url = new URL("" + ""); } catch (MalformsdURLException e) { System.err.println("Can not initialize the default wsdl from " + ""); // e.printStackTrace(); } WSDL_LOCATION = url; } 

    Quindi, le mie domande sono:

    1. Abbiamo davvero bisogno di una posizione WSDL anche se tutte le classi sono state generate da CXF e JAXB? Se sì, perché?

    2. Se non abbiamo davvero bisogno della posizione WSDL, qual è il modo corretto e pulito per rendere CXF non generarlo ed evitarlo del tutto?

    3. Quali cattivi effetti collaterali potremmo ottenere con questo hack? Non possiamo ancora testarlo per vedere cosa succede, quindi se qualcuno potrebbe dire in anticipo, sarebbe bello.