[英]Ant Javac Task Deletes Method
我在Java項目中遇到了一些非常奇怪的行為。 情況是javac
似乎在編譯期間從類中刪除了一個方法。
該類如下所示:
public class MessedUp extends X {
//a bunch of variables here
//a bunch of methods here
public void thisDisappears(String arg){
}
//a bunch more methods here
}
還有另一個實例化並調用此方法的類:
public class WontCompile {
public void doSomething(){
MessedUp mu = new MessedUp();
mu.thisDisappears("something");
}
}
第一類編譯的很好,但是第二類沒有。 javac
輸出類似以下內容:
[javac] C:\mypath\WontCompile.java:251: error: cannot find symbol
[javac] mu.thisDisappears("something");
[javac] ^
[javac] symbol: method thisDisappears(String)
[javac] location: variable mu of type MessedUp
我知道代碼很好,因為我已經在Eclipse中使用了兩年了(當我嘗試使用Eclipse生成的ant
文件時,我正在追蹤這個問題)。 但是, thisDisappears
Eclipse會突出顯示對thisDisappears
的調用,並說它不存在,並願意創建它。 如果接受報價,那么Eclipse會抱怨有兩個名稱相同的方法。 經過一點點整理后,顯然會導致重建或其他原因,該錯誤消失了。
經過一段時間的驅動后,我決定檢查MessedUp.java的實際類文件。 使用Java Decompiler GUI ,我發現在類文件中沒有thisDisappears
!
以下是我的ant文件:
<project basedir="." default="build" name="MyProject">
<property name="LIB_HOME" value="C:\dev\LibSuite-9.3.1"/>
<property environment="env"/>
<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.7"/>
<property name="source" value="1.7"/>
<path id="MyProject.classpath">
<pathelement location="bin"/>
<pathelement location="lib/edu.mit.jwi_2.1.4.jar"/>
<pathelement location="lib/edu.sussex.nlp.jws.beta.11.jar"/>
<pathelement location="lib/jaws-bin.jar"/>
<pathelement location="lib/junit-4.11.jar"/>
<!--External Jars-->
<pathelement location="${LIB_HOME}/share/java/abc.jar"/>
<pathelement location="${LIB_HOME}/share/java/def-9.3.1.jar"/>
</path>
<target name="init">
<mkdir dir="bin"/>
<copy includeemptydirs="false" todir="bin">
<fileset dir="main/src">
<exclude name="**/*.launch"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
<copy includeemptydirs="false" todir="bin">
<fileset dir="main/test">
<exclude name="**/*.launch"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="clean">
<delete dir="bin"/>
</target>
<target depends="init" name="build">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}">
<classpath refid="MyProject.classpath"/>
<src path="main/src"/>
<src path="main/test"/>
<compilerarg value="-Xlint"/>
</javac>
</target>
<!--Test the app-->
<target depends="build" name="regression">
<junit>
<classpath refid="MyProject.classpath"/>
<test name="uni.my.app.TestSuite"/>
</junit>
</target>
<!--Run the app-->
<target depends="build" name="run">
<java classname="uni.my.app.Application">
<classpath refid="MyProject.classpath"/>
<arg value="sentences.txt"/>
</java>
</target>
</project>
不幸的是,我無法提出一個最低限度的例子。 我正在使用的代碼尚未發布給公眾,所以我還不能全部共享。 它引用了幾個jar(沒有沖突的名稱空間),有些引用了本機方法。 我不知道是什么類和jar的確切組合導致錯誤。 我在使用jdk 1.6.0_25和1.7.21時遇到了相同的問題。
是否有人對解決此問題有任何經驗或想法?
這是一個猜測。
Ant在eclipse之外運行,因此它所做的任何更改都不會反映在eclipse大量緩存的世界視圖中。 就我所知,eclipse的更改也沒有反映在ant使用的文件中。
我將清理項目,然后構建項目,然后刷新項目。 我會在月食中看看您是否有這個問題。 然后,我將運行ant(如果必須這樣做),再次刷新,然后查看問題是否存在。
每當您在eclipse或ant中執行任何操作時,在使用其他程序之前,請刷新eclipse項目。
讓我們知道怎么回事。
ps相信Java編譯器不會刪除任何方法。 我同意您正在做一些奇怪的事情,但是不是。
問題在於,無論出於何種原因,另一個用戶都已將項目轉換為VCS,並且所有類文件都位於與它們相應的源相同的文件夾中。 在我的機器上,Eclipse將二進制文件放入bin
文件夾,所以我不知道為什么將它們與源一起放置在另一位用戶的機器上。
Eclipse生成的init
目標旨在復制代碼使用的資源。 它會復制java
或源目錄中的launch
文件以外的任何內容。 但是,由於類文件位於源目錄中,因此它也將它們復制了過來。 然后,在執行build
目標時,它並不需要進行任何編譯,因為似乎已經存在新的類文件(但它們實際上只是舊代碼的新副本)。
解決方法是:1)從源文件夾中刪除所有類文件,2)為資源復制代碼添加**/*.class
排除規則,以達到良好的效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.