Ant kann nicht finden, eine Klasse, die benötigt werden um eine extern definierte taskdef

StackOverflow https://stackoverflow.com/questions/482303

  •  20-08-2019
  •  | 
  •  

Frage

Ich versuche, mit der axis-java2wsdl ant-task zum erstellen einer wsdl-Datei von einem meiner java-Klassen, aber ich kann nicht den Klassenpfad korrekt.

Ich bin mit Ubuntu libaxis-java-Paket, welches installiert axis-ant.jar in $ANT_HOME/lib und axis.jar in /usr/share/java.Die interessanten Teile meine build.xml Aussehen:

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

Laufen ant genwsdl Ergebnisse 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 ist in der Lage zu finden die definition der axis-java2wsdl Aufgabe, weil axis-ant.jar ist in $ANT_HOME/lib, aber es kann nicht finden in Klassen axis.jar obwohl das Glas ist auf den Pfad definiert, die von "Bibliotheken"

Ich weiß, es ist eine classpath-Problem, da war ich in der Lage zu bekommen Vergangenheit DefaultAuthenticator anderen Klasse nicht gefunden wird, indem ein Symlink axis.jar in $ANT_HOME/lib.Wie bekomme ich die taskdef zu erkennen jar-Dateien in /usr/share/lib oder meine Projekt der lokalen lib-Verzeichnis ohne Symlink alles in $ANT_HOME/lib?

EDIT:

Ich war endlich in der Lage, erfolgreich generieren der wsdl-mit dieser Zeile:

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

Ich würde noch sehr viel schätzen, wenn jemand mir sagen könnte was ich falsch mache in nicht definieren konnte die Bibliotheken in build.xml

War es hilfreich?

Lösung

In der Regel funktioniert dies. Aber Sie müssen sehr sorgfältig prüfen, welche Klassen sind, wo.

Wenn Sie Ihre Taskklasse kann Ihre classpathref einfach ignoriert erhalten werden in einem Klassenlader höher in der Hierarchie Classloader (wie CLASSPATH oder ANT_HOME / lib) dann geladen werden .

Lesen Sie den FAQ-Eintrag für weitere Details.

  

Ant Class-Loader-Implementierung verwendet Javas Delegierungsmodell

     

Die Classloader-Klasse verwendet eine Delegation Modell für Klassen und Ressourcen zu suchen. Jede Instanz von Classloader hat einen zugehörigen übergeordneten Klasse Loader. Wenn aufgefordert, eine Klasse oder eine Ressource zu finden, wird eine Classloader-Instanz die Suche nach der Klasse oder Ressource zu seiner übergeordneten Klassenlade delegiert, bevor die Klasse oder die Ressource selbst zu finden. Die virtuellen Maschine integrierten Klasse-Loader, die so genannte Bootstrap Class Loader, hat sich ein Elternteil nicht, sondern kann als die Eltern eines Classloader-Instanz dienen.

. Hinweis: Lauf ant -diagnostics kann auch helfen

Andere Tipps

Ant Mechanismus für das hinzufügen von Bibliotheken:

  • via Kommandozeilen-argument -lib
  • hinzufügen zu ${user.home}/.ant/lib
  • hinzufügen zu ${ant.home}/lib

Nur.Die Handbuch nicht erwähnt nichts über die Verwendung der system.Bibliothek.dir Eigenschaft.Wahrscheinlich ist es so ziemlich ignoriert, für diesen Zweck.

Auch, laufen ant in verbose mode ( und ausführlich), um zu sehen, was ist zu tun, unter der Haube.

Warum nicht nur die einfachste Option und den Klassenpfad in Ihrem <taskdef> angeben?

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

oder erstellen Sie einen zweiten <classpath> Eintrag, library.dir Teilmengen?

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

Herumspielen mit ${ant.home}/lib ist nicht so eine gute Idee, und fast immer vermieden werden können.

Es funktioniert für mich die Classpath direkt in der taskdef Aufgabe angeben, wie menstioned von matt b . Für mein Projekt finde ich es sinnvoll, die taskdef Bibliothek im Projektordner und geben Sie den Classpath in der Ant-Build-Datei enthalten sein, um einfach das Setup auf andere Entwicklung pcs. Ich verwende den folgenden taskdef:

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

Beachten Sie, dass dies nicht für die Versionen von Ameise funktionieren kann früher als 1.7.0.

Mit den Antworten von hier und alle Teilinformationen, kam ich mit einer Lösung auf. Ich habe das Glas die ant-Datei in einen Ordner lib in das Projekt benötigt werden (speziell JDBC-Treiber MySQL). Dann laufe ich eine Setup-Aufgabe in Ameise, die Kopien zu Hause .ant / lib-Ordner des Benutzers, und dann mit einer Meldung Ameise ausfallen neu zu starten. Es scheitert nur einmal für einen Benutzer, und arbeitet dann jedes Mal. Es könnte schwierig sein, wenn Sie das Glas auf eine neue Version aktualisieren ...

Hier ist die Ameise build.xml:

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

Hope, das hilft

Ich traf das gleiche Problem, wenn ich ein * .jar an den {ant.home} Kopieren / Libs, dann i Benutzer die -lib die * .jar ausfindig zu machen, ist es läuft ok! Ich halte es die neuen Gläser können nicht geladen werden, dann werden testen i it!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top