النمل لا يمكن العثور على الفئة التي يحتاجها خارجيا تعريف taskdef

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

  •  20-08-2019
  •  | 
  •  

سؤال

وأنا أحاول أن استخدام المحور java2wsdl النمل مهمة لخلق wsdl من بلدي واحد من فئات java, ولكن لا يمكن الحصول على classpath الصحيح.

أنا أستخدم أوبونتو libaxis-java حزمة تثبيت axis-ant.jar في $ANT_HOME/lib ، axis.jar في /usr/share/java.مثيرة للاهتمام أجزاء من بلدي build.xml تبدو مثل هذا:

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

تشغيل ant genwsdl النتائج في:

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

النمل هو قادرة على العثور على تعريف المحور java2wsdl المهمة ، لأن axis-ant.jar في $ANT_HOME/lib, ولكن لا يمكن العثور على فصول في axis.jar رغم أن الجرة على مسار محدد من قبل "المكتبات"

أعرف أنه classpath المسألة لأنني كنت قادرا على الحصول على الماضي DefaultAuthenticator إلى فئة أخرى لم يتم العثور من قبل symlinking axis.jar إلى $ANT_HOME/lib.كيف يمكنني الحصول على taskdef الاعتراف جرة الملفات في /usr/share/lib أو المشروع المحلية دليل ليب دون symlinking كل شيء في $ANT_HOME/lib?

تحرير:

كنت في النهاية قادرا على توليد بنجاح wsdl مع هذا الخط:

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

وأود أن لا تزال نقدر كثيرا إذا كان شخص ما يمكن أن تقول لي ما أفعله خطأ في عدم القدرة على تحديد هذه المكتبات في build.xml

هل كانت مفيدة؟

المحلول

في هذه الأعمال.ولكن تحتاج إلى التحقق بعناية فائقة والتي الطبقات فيها.

إذا مهمتك فئة يمكن تحميلها في classloader أعلى في classloader الهرمي (مثل CLASSPATH أو ANT_HOME/lib) ثم classpathref ببساطة سوف تحصل على تجاهلها.

قراءة الأسئلة الشائعة للحصول على مزيد من التفاصيل.

النملة عربة الدرجة تنفيذ يستخدم جافا وفد نموذج

ClassLoader الصف يستخدم وفد نموذج للبحث عن دروس والموارد.لكل مثيل من ClassLoader مقترن الفئة الأصل محمل.عندما دعا إلى العثور على فئة أو الموارد ، ClassLoader سبيل المثال سوف مندوب البحث عن الطبقة أو الموارد إلى الأم class loader قبل محاولة للعثور على فئة أو الموارد نفسها.الجهاز الظاهري المدمج في عربة الدرجة ، ودعا التمهيد محمل فئة لا حد ذاته أحد الوالدين ولكن قد تكون بمثابة الأم ClassLoader سبيل المثال.

ملاحظة:تشغيل ant -diagnostics يمكن أن تساعد أيضا.

نصائح أخرى

النمل آلية إضافة المكتبات هي:

  • عبر وسيطة سطر الأوامر -lib
  • إضافة إلى ${المستخدم.المنزل}/.النمل/lib
  • إضافة إلى ${النمل.المنزل}/lib

فقط.على دليل لا يذكر أي شيء عن استخدام النظام.المكتبة.dir مكان الإقامة.ربما الى حد كبير تجاهل لهذا الغرض.

أيضا تشغيل النمل في الوضع المطول ( و-مطول ) لمعرفة ما هو تحت غطاء محرك السيارة.

لماذا لا تأخذ فقط أبسط الخيار وتحديد CLASSPATH في <taskdef> بك؟

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

وأو إنشاء إدخال <classpath> الثاني الذي فرعية library.dir؟

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

والعبث مع ${ant.home}/lib ليست هذه فكرة جيدة ويمكن دائما تقريبا يمكن تجنبها.

وكان يعمل بالنسبة لي لتحديد CLASSPATH مباشرة في مهمة taskdef، كما menstioned التي كتبها <م> مات ب . لمشروعي أجد أنه من المفيد أن تتضمن المكتبة taskdef في مجلد المشروع وتحديد CLASSPATH في ملف البناء النمل، لمجرد الإعداد على جهاز كمبيوتر شخصى الإنمائية الأخرى. يمكنني استخدام taskdef التالية:

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

لاحظ أن هذا قد لا تعمل لإصدارات من النمل في وقت سابق من 1.7.0.

وعن طريق الإجابات من هنا وجميع المعلومات الجزئية، خطرت لي حل. وأضاف لي جرة ملف النمل حاجة إلى مجلد ليب في المشروع (الخلية تحديدا JDBC السائقين). ثم أركض مهمة الإعداد في نملة أن نسخا منها إلى المستخدم .ant الرئيسية للمجلد ليب /، ثم فشل النمل مع رسالة لإعادة تشغيل. فشلت مرة واحدة فقط للمستخدم، ثم يعمل في كل مرة. قد تكون خادعة إذا قمت بتحديث جرة إلى إصدار جديد ...

وهنا يكمن 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>

ويساعد هذا الأمل

والتقيت نفس المشكلة عندما كنت نسخ * جرة إلى {ant.home} / يبس، وبعد ذلك المستخدم -lib لتحديد موقع * جرة، انها تدير بخير! أنا أعتبر أنه من الجرار جديدة لا يمكن تحميل، وبعد ذلك سوف اختبار ذلك!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top