2013-04-16 12 views
7

Żeby było jasne, to nie jest to pytanie: Ant is using wrong java versionAnt używa niewłaściwego Java Compiler, ale uważa, że ​​ma rację

Próbuję skompilować Java 1.7 projektu przy użyciu Ant na Mac OS 10.8.2 maszynie . Mam zainstalowaną Javę 1.7, a Eclipse buduje ją płynnie. Jednak w przypadku korzystania z ant skrypt budować z realizacją wiersza poleceń Ant jak tak

ant -v 

wyjście jest tajemnicza co najwyżej: Pierwsze linie pokazują, że Ant używa Java 1.7 na żądanie, z lokalizacji $ JAVA_HOME, jak się ustawiłem.

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 

Jednakże następujące błędy kompilatora nie ma sensu, ponieważ ujawniają błąd kompilatora, które występują tylko w wersji przed 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]       ^

To jest bardzo dziwne. Próbowałem wielu rzeczy, w tym ponownego instalowania Java JDK i reinstalacji Ant. Czy ktoś tam ma pewien wgląd w to, co może być przyczyną tego zagadkowego problemu?

Jeśli to każda pomoc:

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 

Edycja: Zgodnie z wnioskiem komentujących, Dodałem moje build.xml i plików MANIFEST.MF poniżej.

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> 

MANIFEST.MF

Manifest-Version: 1.0 
Class-Path: 
+0

Czy możesz nam pokazać kod pliku manifest.mf i build.xml – Nanashi

+0

Spróbuj ustawić wersję poziomu źródłowego podczas wywoływania zadania 'javac' w' build.xml'. – Jesper

+0

Czy zaimportowałeś potrzebne pakiety? – Kishore

Odpowiedz

6

Spróbuj

ant -diagnostics | grep java\\.home 

Zobaczysz gdzie Ant myśli jest zainstalowana Java. Możliwe, że pobiera go skądś poza tym, co używasz w Eclipse, ponieważ, oczywiście, Eclipse pozwala użytkownikowi określić na podstawie projektu, gdzie znajduje się oprzyrządowanie JDK. Można też po prostu uruchomić ant -diagnostics aby zobaczyć pełną moc diagnostyczną, która w zasadzie dodać informacje, takie jak informacje o wersji Java itd

W aktualnej skrypt Ant, dlaczego nie odzwierciedlają następujące w celu budowy:

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

Zapewni to informacje umożliwiające odróżnienie kontenera, w którym działa Ant, od tego, w którym aplikacja ma się skompilować.

Można wymusić swoją aplikację do kompilacji z określonej wersji Java dodając te specyfikatory do javac specyfikatorem w celu budowy:

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

Ponadto, można uruchomić Ant w trybie opisowym, określając „- v opcja, ala ant -v .... Informacje te powinny pomóc w debugowaniu problemu i, miejmy nadzieję, w rozwiązaniu tego problemu.

Powiązane problemy