Domanda

Sto cercando di utilizzare l'attività ant-axis-java2wsdl per creare un wsdl da una delle mie classi java, ma non riesco a ottenere il percorso di classe corretto.

Sto usando il pacchetto libaxis-java di Ubuntu che installa axis-ant.jar in $ ANT_HOME / lib e axis.jar in / usr / share / java. Le parti interessanti del mio build.xml si presentano così:

<property name="library.dir" value="lib"/>
<property name="system.library.dir" value="/usr/share/java"/>
<path id="libraries">
    <fileset dir="${library.dir}">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="${system.library.dir}">
        <include name="*.jar"/>
    </fileset>
</path>

<target name="genwsdl" depends="compile">
    <taskdef resource="axis-tasks.properties" classpathref="libraries"/>
    <axis-java2wsdl>
            details omitted
    </axis-java2wsdl>
</target>

L'esecuzione di ant genwsdl risulta in:

/build.xml:50: taskdef A class needed by class
org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask
cannot be found: org/apache/axis/utils/DefaultAuthenticator

Ant è in grado di trovare la definizione dell'attività axis-java2wsdl, perché axis-ant.jar è in $ ANT_HOME / lib, ma non riesce a trovare le classi in axis.jar, anche se quel jar si trova sul percorso definito da " quot librerie &;

So che è un problema di percorso di classe perché sono stato in grado di superare DefaultAuthenticator ad altre classi che non sono state trovate collegando sym. axis.jar in $ ANT_HOME / lib. Come posso fare in modo che il taskdef riconosca i file jar in / usr / share / lib o nella directory lib locale del mio progetto senza collegare in modo simbolico tutto in $ ANT_HOME / lib?

EDIT:

Sono stato finalmente in grado di generare con successo il wsdl con questa riga:

ant -lib /usr/share/java/axis.jar -lib /usr/share/java/jaxrpc.jar -lib /usr/share/java/wsdl4j.jar -lib /usr/share/java/commons-logging.jar -lib /usr/share/java/commons-discovery.jar -lib build genwsdl

Gradirei ancora molto se qualcuno potesse dirmi cosa sto facendo di sbagliato nel non riuscire a definire quelle librerie in build.xml

È stato utile?

Soluzione

In generale, funziona. Ma devi controllare con molta attenzione quali classi sono dove.

Se la tua classe di attività può essere caricata in un classloader più in alto nella gerarchia del classloader (come CLASSPATH o ANT_HOME / lib), il tuo classpathref verrà semplicemente ignorato .

Leggi la voce FAQ per maggiori dettagli.

  

L'implementazione del caricatore di classi di Ant utilizza Modello di delega di Java

     

La classe ClassLoader utilizza un modello di delega per cercare classi e risorse. Ogni istanza di ClassLoader ha un programma di caricamento classi padre associato. Quando viene richiesto di trovare una classe o una risorsa, un'istanza ClassLoader delegherà la ricerca della classe o della risorsa al proprio caricatore di classi padre prima di tentare di trovare la classe o la risorsa stessa. Il caricatore di classi incorporato della macchina virtuale, chiamato caricatore di classi bootstrap, non ha esso stesso un genitore ma può fungere da genitore di un'istanza ClassLoader.

Nota: l'esecuzione di ant -diagnostics può aiutare anche .

Altri suggerimenti

Il meccanismo per l'aggiunta di librerie è:

  • tramite argomento della riga di comando -lib
  • aggiungendo a $ {user.home} /. ant / lib
  • aggiungendo a $ {ant.home} / lib

Solo. Il manuale non menziona nulla sull'uso della proprietà system.library.dir . Probabilmente è praticamente ignorato a questo scopo.

Inoltre, esegui ant in modalità dettagliata (e -verbose) per vedere cosa sta facendo sotto il cofano.

Perché non semplicemente prendere l'opzione più semplice e specificare il percorso di classe nel tuo <taskdef>?

<taskdef resource="axis-tasks.properties">
    <classpath>
        <fileset file="/path/to/axis/jars"/>
    </classpath>
</taskdef>

O crea una seconda <classpath> voce che mette in sottoinsieme library.dir?

<path id="axis-tools-classpath">
    <fileset dir="/path/to/axis/home">
        <include name="*.jar"/>
    </fileset>
    <path refid="library.dir"/>
</path>

Fare casini con ${ant.home}/lib non è una buona idea e può quasi sempre essere evitato.

Funziona per me specificare il classpath direttamente nell'attività taskdef, come indicato da matt b . Per il mio progetto trovo utile includere la libreria taskdef nella cartella del progetto e specificare il percorso di classe nel file build ant, da configurare semplicemente su altri pc di sviluppo. Uso il seguente taskdef:

<taskdef resource="antenna.properties" classpath="${myprojectroot}/lib/antenna-bin-1.2.1-beta.jar"/>

Nota che potrebbe non funzionare con versioni di ant precedenti alla 1.7.0.

Usando le risposte da qui e tutte le informazioni parziali, ho trovato una soluzione. Ho aggiunto il jar del file ant necessario a una cartella lib nel progetto (in particolare i driver mysql jdbc). Quindi eseguo un'attività di installazione in formica che copia nella cartella home .ant / lib dell'utente e quindi non riesce a riavviare la formica con un messaggio. Non riesce solo una volta per un utente, quindi funziona ogni volta. Potrebbe essere complicato aggiornare il jar a una nuova versione ...

Ecco la build.xml di form:

<project name="data_source" default="build">

  <!-- BUILD PROPERTIES -->
  <property file="build.properties"/>

  <!-- SQL Server Properties -->
  <property name="sql.driver" value="org.gjt.mm.mysql.Driver"/>
  <property name="sql.url" value="jdbc:mysql://127.0.0.1/datastore"/>
  <property name="sql.user" value="user"/>
  <property name="sql.pass" value="password"/>

  <!-- FILE LOCATIONS  -->
  <property name="sql.dir" location="sql"/>

  <!-- INITIALIZE PROJECT -->
  <target name="init" description="Initialize the project">
      <available property="no.ant.lib.dir" file="${user.home}/.ant/lib/" type="dir" />
  </target>

  <!-- SETUP MYSQL -->
  <target name="setup_mysql" description="Copy the lib so ant can see it" unless="no.ant.lib.dir">
      <mkdir dir="${user.home}/.ant"/>
      <mkdir dir="${user.home}/.ant/lib"/>
      <copy file="lib/mysql-connector-java-5.1.13-bin.jar" todir="${user.home}/.ant/lib"/>

      <!-- ant already missed picking up the jar - we have to restart -->
      <fail message="JDBC mysql class copied to ${user.dir}/.ant/lib/ - please restart ant" />
  </target>

  <!-- BUILD DATA SOURCES -->
  <target name="build" depends="init,setup_mysql,clean_data" description="Create and populate tables">

    <sql driver="${sql.driver}" url="${sql.url}" userid="${sql.user}" password="${sql.pass}" >
      <transaction src="${sql.dir}/create_tables.sql"/>
      <transaction src="${sql.dir}/insert_data.sql"/>
    </sql>
  </target>

   <!-- CLEAN PROJECT -->
  <target name="clean" description="Cleans up project build">
    <!-- Don't clean data sources here - may get called by accident -->
  </target>

  <!-- Delete all tables and data -->
  <target name="clean_data" description="Deletes all data and tables">
    <echo>Dropping all database tables in ${sql.schema}...</echo>
    <property name="exec.command" value="mysqldump -u${sql.user} -p${sql.pass} --add-drop-table --no-data ${sql.schema} | grep ^DROP | mysql -u${sql.user} -p${sql.pass} ${sql.schema}" />
    <exec executable="sh">
      <arg value = "-c"/>
      <arg value="${exec.command}"/>
    </exec>

  </target>

</project>

Spero che questo aiuti

Ho riscontrato lo stesso problema quando copio un * .jar in {ant.home} / libs, quindi uso il -lib per localizzare il * .jar, funziona bene! Penso che i nuovi vasetti non possano essere caricati, quindi lo proverò!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top