簡體   English   中英

Ant Javac任務刪除方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM