2013-08-26 4 views
0

Tagging-Selenium, а также на всякий случай, когда кто-то сталкивался с подобной проблемой при создании тестов на селен с использованием Ant.java.lang.NoClassDefFoundError + ant - running jar

Я видел много вопросов/ответов на эту тему, пробовал все варианты, предлагаемые на разных форумах, но все же моя проблема не решена. В основном я компилирую код (включая тестовые скрипты), создаю JAR и запускаю тот же JAR. По какой-то причине он, по-видимому, не идентифицирует библиотеки во время выполнения. Тот же код (с тестами) отлично работает, когда метод main() запускается из Eclipse. Вот build.xml,

<project default="run"> 

<target name="clean"> 
    <delete dir="build" /> 
</target> 

<target name="init-classpath"> 
    <path id="lib.classpath"> 
     <fileset dir="./lib/"> 
      <include name="**.jar" /> 
     </fileset> 
    </path> 
    <pathconvert property="mf.classpath" pathsep=" "> 
     <path refid="lib.classpath" /> 
     <flattenmapper /> 
    </pathconvert> 
</target> 

<target name="jar" depends="clean, init-classpath"> 
    <javac classpathref="lib.classpath" destdir="./compiled" failonerror="true" srcdir="./src" /> 
    <mkdir dir="build/jar" /> 
    <jar destfile="build/jar/BANC.jar" basedir="compiled"> 
     <manifest> 
      <attribute name="Main-Class" value="com.portico.driver.TestDriver" /> 
      <attribute name="Class-Path" value="${mf.classpath}" /> 
     </manifest> 
    </jar> 
</target> 

<target name="run" depends="jar"> 
    <java jar="build/jar/BANC.jar" fork="true"> 
    </java> 
</target> 

</project> 

Ошибка: -Exception в теме "главный" java.lang.NoClassDefFoundError: JXL/Учебное пособие

Manifest содержание

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.3 
Created-By: 1.6.0_41-b02 (Sun Microsystems Inc.) 
Main-Class: com.portico.driver.TestDriver 
Class-Path: activation.jar commons-lang-2.4.jar jna-3.4.0.jar jxl.jar 
logging-selenium-1.2.jar mail.jar ojdbc14.jar poi-3.0.2-FINAL.jar rep 
ortng-1.1.1.jar saxon-8.7.jar selenium-grid-demo-1.0.7.jar selenium-g 
rid-demo-standalone-1.0.7.jar selenium-grid-hub-1.0.7.jar selenium-gr 
id-hub-standalone-1.0.7.jar selenium-grid-remote-control-1.0.7.jar se 
lenium-grid-remote-control-standalone-1.0.7.jar selenium-grid-tools-1 
.0.7.jar selenium-grid-tools-standalone-1.0.7.jar selenium-server-1.0 
.3-standalone.jar selenium-server-standalone-2.33.0.jar sikuli-script 
.jar testng-6.8.jar velocity-1.7.jar 
+0

У вас есть включение jxl.jar ??? –

+0

В папке lib существует ли jxl.jar? –

+0

Да, все необходимые JAR-файлы присутствуют в папке lib. – Akbar

ответ

0

Первое, что нужно проверить является ли проблема связана с манифестом или чем-то еще. Если вы можете запустить приложение с помощью java -cp <allthejarfiles> <main-class>, проблема связана с манифестом. Имейте в виду, что файлы jar, указанные в манифесте, относятся к местоположению файла jar. Попытка запуска приложения с помощью опции -verbose: class дает подсказку о том, какая из jar действительно загружена.

+0

Я разместил содержимое файла манифеста в приведенном выше комментарии , О местоположении файла jar - Кажется, это чтение из правильной папки библиотеки, потому что, когда я пытался изменить, он выдал ошибку о папке, которая не существует. Моя структура проекта - projectroot/src (исходный код), projectroot/compiled (скомпилированный код), projectroot/lib (содержит все библиотеки проектов), projectroot/build/jar (каталог JAR) ... как вы считаете, необходимы какие-либо изменения в явном классе? – Akbar

+0

В вашем комментарии я не вижу никаких путей, поэтому JVM ожидает, что все банки будут находиться в одном каталоге.Это не соответствует описанию наличия каталога для встроенного jar и другого для ссылочных библиотек (если эти библиотеки не скопированы в целевой каталог сборки). Вы когда-нибудь пытались запустить приложение, указав все банки вручную? – Holger

+0

Содержимое манифестного файла (не помещало весь контент, но перечисляло все JAR как разделенные пробелы), Manifest-Version: 1.0 Ant-Version: Apache Ant 1.8.3 Created-By: 1.6.0_41-b02 (Sun Microsystems Inc.) Main-Class: com.portico.driver.TestDriver Class-Path: activation.jar commons-lang-2.4.jar jna-3.4.0.jar jxl.jar – Akbar

0

Ваш манифест принимает банки в текущем рабочем каталоге. Поэтому для атрибута dir потребуется папка, в которой существует банка.

Java task поддерживает предоставление пути к классам в аргументах. Попробуйте дать classpath в аргументах.

<target name="run" depends="jar"> 
    <java jar="build/jar/BANC.jar" fork="true" dir="build/jar" > 
     <classpath> 
      <pathelement path="${lib.classpath}"/> 
     </classpath> 
    </java> 
</target> 
+0

Пробовал все варианты, но не работает – Akbar

0

Я столкнулся с той же проблемой в своем проекте. Я предлагаю вам создать отдельный каталог специально для файлов jar, поместить все ваши банки в этот каталог и затем указать адрес lib в этот каталог.

например, в вашем случае говорят, что я создал каталог D:/jar_collection, где я поместил все свои банки в физическом состоянии.

<property name="lib.dir" value="D:/jar_collection"/> 
<target name="setClassPath"> 
    <path id="classpath_jars"> 
     <fileset dir="${lib.dir}" includes="*.jar" /> 
    </path> 
    <pathconvert pathsep=":" property="test.classpath" refid="classpath_jars" /> 
</target> 

и он отлично работает. Попробуйте один раз.

Смежные вопросы