0

Antを使用してセレンテストを作成しているときに誰かが同様の問題に直面した場合に備えて、タグ付け-セレンも同様です。

このトピックに関する多くの質問/回答を見て、さまざまなフォーラムで提案されたすべてのオプションを試しましたが、それでも問題は解決しません。基本的に、コードをコンパイルし (テスト スクリプトを含む)、JAR を作成し、同じ JAR を実行します。何らかの理由で、実行時にライブラリを識別していないようです。Eclipse から main() メソッドを実行すると、同じコード (テストあり) が正常に動作します。これが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>

エラー: - スレッド「メイン」での例外 java.lang.NoClassDefFoundError: jxl/Workbook

マニフェストの内容

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
4

3 に答える 3

0

マニフェストは、現在の作業ディレクトリ内の jar を想定しています。したがって、jar が存在するフォルダーに設定された dir 属性が必要になります。

Java タスクは、引数でのクラスパスの提供をサポートしています。引数にクラスパスを指定してみてください。

<target name="run" depends="jar">
    <java jar="build/jar/BANC.jar" fork="true"  dir="build/jar" >
        <classpath>
           <pathelement path="${lib.classpath}"/>
         </classpath>
    </java>
</target>
于 2013-08-31T03:12:35.327 に答える
0

最初に確認することは、問題がマニフェストに関連しているのか、それとも他の何かに関連しているのかです。問題が発生したアプリケーションを実行できる場合はjava -cp <allthejarfiles> <main-class>、マニフェストに関連付けられています。マニフェストで指定された jar ファイルは、jar ファイルの場所に対して相対的であることに注意してください。-verbose:class オプションを指定してアプリケーションを実行しようとすると、どの jar が実際にロードされているかについてのヒントが得られます。

于 2013-08-29T10:03:44.963 に答える
0

私のプロジェクトで同じ問題に直面しました。jar ファイル専用の別のディレクトリを作成し、すべての jar ファイルをそのディレクトリに置き、lib アドレスをそのディレクトリに向けることをお勧めします。

たとえば、あなたの場合、D:/jar_collectionすべてのjarを物理的に配置したディレクトリを作成したとします。

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

そしてそれはうまくいきます。ぜひ一度お試しください。

于 2013-09-03T16:09:57.750 に答える