8

明確にするために、これはこの質問ではありません: Ant is using wrong Java version

Mac OS 10.8.2 マシンで Ant を使用して Java 1.7 プロジェクトをコンパイルしようとしています。私は Java 1.7 をインストールしており、Eclipse は順調にビルドを進めています。ただし、Antのコマンドライン実行でantビルドスクリプトを使用すると、

ant -v

出力はせいぜい不思議です。最初の行は、Ant が $JAVA_HOME の場所から要求どおりに Java 1.7 を使用していることを示しています。

Apache Ant(TM) version 1.8.2 compiled on December 20 2010
Trying the default build file: build.xml
Buildfile: /Users/emish/School/cis555/homework/cis-555-search-engine/build.xml
Detected Java version: 1.7 in: /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home/jre
Detected OS: Mac OS X

ただし、次のコンパイラ エラーは、Java 1.7 より前のバージョンでのみ発生するコンパイラ エラーを明らかにしているため、意味がありません。

[javac] /Users/emish/School/cis555/homework/cis-555-search-engine/src/pokedex/crawler/CrawlCore.java:186: <identifier> expected
[javac]         } catch (IOException | ClassNotFoundException | InterruptedException e) {
[javac]                             ^

これは非常に奇妙です。Java JDK の再インストールや Ant の再インストールなど、多くのことを試しました。この不可解な問題の原因について、何らかの洞察を持っている人はいますか?

それが助けになる場合:

java -version
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)

javac -version
javac 1.7.0_17

echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home

ll `which javac`
lrwxr-xr-x  1 root  wheel  75 Oct 30 22:27 /usr/bin/javac -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javac

ll `which java`
lrwxr-xr-x  1 root  wheel  74 Oct 30 22:27 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

編集:コメンターのリクエストに応じて、build.xml ファイルと manifest.mf ファイルを以下に追加しました。

build.xml

<?xml version="1.0"?>

<project name="pokedex" default="jar" basedir=".">
    <property name="shared.root" location="${basedir}"/>
    <property name="project.root" location="${basedir}"/>
    <property name="build.dir" location="${project.root}${file.separator}build"/>
    <property name="src" location="${project.root}${file.separator}src"/>
    <property name="build.classes" location="${build.dir}${file.separator}classes"/>
    <property name="test.classes" location="${build.classes}${file.separator}test"/>
    <property name="test.source" location="${src}${file.separator}test"/>
    <property name="lib.dir" location="${project.root}${file.separator}lib"/>


    <target name="jar" depends="clobber, compile" description="Create Jar file">
          <jar destfile="pokedex.jar">
            <fileset dir="${build.classes}" includes="**/*.class"/>
            <fileset dir="${project.root}" includes="conf/*"/>
          </jar>
    </target>

    <target name="compile" depends="clobber" description="compiles Java source code">
        <javac srcdir="${src}${file.separator}" destdir="${build.classes}" debug="on" deprecation="off"
            optimize="on" includeAntRuntime="no">
            <classpath>
                <fileset dir="${lib.dir}">
                    <include name="*.jar"/>
                    <include name="*.zip"/>
                </fileset>
            </classpath>
        </javac>
    </target>

    <target name="pack" depends="jar" description="Create an archive use on EC2">
          <zip destfile="pokedex.zip">
            <zipfileset dir="." excludes="target/**,extra/**,**/*.class,pokedex.zip"/>
          </zip>
    </target>

  <target name="clobber" description="remove jar">
        <delete file="${project.root}${file.separator}pokedex.jar"/>
        <delete dir="${build.classes}${file.separator}"/>
        <mkdir dir="${build.classes}${file.separator}"/>
    </target>

       <!--DOES NOT WORK -->
       <target name="test" description="Run tests">
         <java failonerror="true" fork="true" classname="junit.textui.TestRunner">
           <classpath>
             <pathelement location="${test.classes}"/>
             <pathelement location="${build.classes.dir}"/>
              <fileset dir="${lib.dir}">
                  <include name="*.jar"/>
              </fileset>
           </classpath>
            <arg value="RunAllTests"/>
         </java>
       </target>

    <target name="test2">
      <junit>
        <classpath>
             <pathelement location="${build.classes.dir}"/>
                <fileset dir="${lib.dir}">
                     <include name="*.jar"/>
                </fileset>
              </classpath>   
        <batchtest>
           <fileset dir="${project.root}">
                <include name="**/RunAllTests*" />
           </fileset>
        </batchtest>
        <formatter type="brief" usefile="false"/>
      </junit>
    </target>

</project>

マニフェスト.mf

Manifest-Version: 1.0
Class-Path: 
4

1 に答える 1

8

試す

ant -diagnostics | grep java\\.home

Ant が Java がインストールされていると見なす場所が表示されます。もちろん、Eclipse ではユーザーがプロジェクトごとに JDK ツールが配置されている場所を指定できるため、Eclipse で使用しているもの以外の場所から取得している可能性があります。実行ant -diagnosticsして完全な診断出力を表示することもできます。これにより、基本的に Java バージョン情報などの情報が追加されます。

実際の Ant スクリプトでは、ビルド ターゲットで以下をエコーし​​ないでください。

<echo message="Ant running on Java version ${ant.java.version}"/>

これにより、Ant が実行されているコンテナーと、アプリケーションをコンパイルするコンテナーを区別するための情報が提供されます。

javacこれらの指定子をビルド ターゲットの指定子に追加することで、アプリケーションを特定の Java バージョンでコンパイルするように強制できます。

<javac debug="true" 
... 
source="1.7" 
target="1.7" 
...
executable="<MY_JDK7_JAVA_HOME_DIR>/bin/javac" 
... >
... 
</javac>

また、'-v' オプション ala を指定することで、冗長モードで Ant を実行できますant -v ...。この情報は、問題をデバッグし、できれば解決するためのガイドとなるはずです。

于 2013-05-14T21:10:35.470 に答える