2

考えられる答えスタックオーバーフローの質問

私の問題は、上記のスレッドで説明されているものと同じです。解決策を試しましたが、機能しません。 ant コンパイルは完全に機能します。メインクラスを読み込めないと言っているant jar

Exception in thread "main" java.lang.NoClassDefFoundError: LoadServer (wrong name: org/module/loader/LoadServer)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

コマンドラインで次のことを行いました

JAVA_HOME="/usr/local/java/jdk1.7.0_21"
ANT_HOME="/usr/share/ant/"
PATH="$ANT_HOME/bin:$PATH"

さらに、新しい端末を起動してecho$JAVA_HOMEと入力すると、上記の結果が表示されますが、 echo$ANT_HOMEは null を返します。

ここにスクリーンショットがあります

初期エラー

     <project name="Raxa-4" basedir="." default="main">

    <property name="src.dir"      value="src"/>
    <property name="prop.dir"     value="properties"/>
    <property name="resource.dir" value="resource"/>
    <property name="lib.dir"      value="lib"/>
    <property name="build.dir"    value="build"/>
    <property name="classes.dir"  value="${build.dir}/classes"/>
    <property name="jar.dir"      value="${build.dir}/jar"/>
    <property name="main-class"   value="org.raxa.module.loader.LoadServer"/>

    <path id="classpath">
            <fileset dir="${lib.dir}" includes="**/*.jar"/>
    </path>

    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false" />
        <copy todir="${classes.dir}">
            <fileset dir="${resource.dir}" excludes="**/*.java"/>
            <fileset dir="${prop.dir}" excludes="**/*.java"/>
        </copy>
    </target>

   <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
         <classpath>
            <path refid="classpath"/>
            <path location="${jar.dir}/${ant.project.name}.jar"/>
        </classpath>
        </jar>
    </target>


    <target name="run" depends="jar">
        <java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>

    </target>

    <target name="clean-build" depends="clean,jar"/>

    <target name="main" depends="clean,run"/>

</project>

編集:

    <property name="src.dir"      value="src"/>
    <property name="prop.dir"     value="properties"/>
    <property name="resource.dir" value="resource"/>
    <property name="lib.dir"      value="lib"/>
    <property name="build.dir"    value="build"/>
    <property name="classes.dir"  value="${build.dir}/classes"/>
    <property name="jar.dir"      value="${build.dir}/jar"/>
    <property name="main-class"   value="org.raxa.module.loader.LoadServer"/>

    <path id="classpath">
            <fileset dir="${lib.dir}" includes="**/*.jar"/>
    </path>

    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false" />
        <copy todir="${classes.dir}">
            <fileset dir="${resource.dir}" excludes="**/*.java"/>
            <fileset dir="${prop.dir}" excludes="**/*.java"/>
        </copy>
    </target>

   <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
            </manifest>
        </jar>
    </target>


    <target name="run" depends="jar">
        <java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
        <classpath>
            <path refid="classpath"/>
            <path location="${jar.dir}/${ant.project.name}.jar"/>
        </classpath>
    </target>

    <target name="clean-build" depends="clean,jar"/>

    <target name="main" depends="clean,run"/>

</project>

ant 実行時の新しいエラー

走る:

[java] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
 [java]     at org.raxa.module.scheduler.TimeSetter.<clinit>(Unknown Source)
 [java]     at org.raxa.module.loader.LoadServer.main(Unknown Source)
 [java] Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
 [java]     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
 [java]     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
 [java]     at java.security.AccessController.doPrivileged(Native Method)
 [java]     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
 [java]     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
 [java]     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
 [java]     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
 [java]     ... 2 more
 [java] Java Result: 1

BUILD FAILED
/home/atul/Documents/workspace2/Raxa-4/build.xml:41: Problem: failed to create task or type classpath
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken pla

ce。

4

2 に答える 2

1

おそらく問題は、クラスパスがオーバーライドされることです。これを試してください:

<java classname="${main-class}" fork="true" >
  <classpath>
    <path refid="classpath"/>
    <pathelement location="${jar.dir}/${ant.project.name}.jar"/>
  </classpath>
</classpath> </java>
于 2013-07-25T15:41:28.210 に答える
0

ANT_HOMEシェル スクリプトによって設定されるため、定義する必要はありませんant。ただし、実行した場合はEXPORT ANT_HOME、新しいターミナルを起動したときに表示されます。環境変数をエクスポートするまで、子プロセスには表示されません。

Ant クラスが呼び出しに表示されないことに気付きました。org.apache.tools.antこれが Ant の問題である場合は、スタック トレースのどこかに呼び出しが表示されているはずです。他のビルド タスクを実行できますか? 試す:

$ ant clean

それは動作しますか?

Ant には広範なデバッグ トレースがあり、知りたい情報よりもはるかに多くの情報が表示されます。パラメータで実行antしてみて-dください:

$ ant -d compile | tee ant.out

これにより大量の出力が生成されるため、これをファイルにパイプする必要があります。ant.outどこが失敗しているかを見てください。compileタスクを呼び出しましたか?

ant-launcher が呼び出しant.jarorg.ant.tools.taskdefs.javac(パスを覚えていれば) を呼び出し、システム コマンドを実行してjavac実行可能ファイルを直接呼び出します。ダンプが示すことの 1 つは、コンパイルが完了したときに実行されている正確なコマンドです。

これはおそらく、エラーが発生している場所を見つけるのに役立ちます。それjavac自体が実行されていないか、欠落している可能性があります。以前、誰かが誤っJAVA_HOMEて JDK ではなく JRE を指しているのを見たことがあります。実行可能ファイルが 64 ビットで、OS が 32 ビットの場合も見てきました。

javac実行中の実際の Java コマンドがダンプに表示されている場合は、それをコピーしてシェル スクリプトに貼り付け、コマンドを直接実行できるかどうかを確認します。このようにして、問題がAnt にあるのjavacか、Ant にあるのかを確認できます。Ant なしで実行できる場合はjavac、Ant の問題です。それ以外の場合は、Java のインストールに問題があります。

于 2013-07-25T15:52:13.030 に答える