2013-04-17 3 views
0

Java 프로젝트에서 기발한 몇 가지 동작이 있습니다. 상황은 javac 컴파일하는 동안 클래스에서 메서드를 제거하는 것 같습니다.Ant 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 

나는 내가이 문제를 추적하고 있습니다 (몇 년 이클립스에서 사용 되었기 때문에 나는 ant 파일을 사용하려고 같은 코드가 좋은 것을 알고 이클립스 제작). 그러나 잠시 후 이클립스는 thisDisappears에 대한 호출을 강조하고 존재하지 않는다고 말하면서 그것을 생성하겠다고 제안합니다. 제안을 수락하면 Eclipse는 같은 이름을 가진 두 가지 메소드가 있다고 불평합니다. 외관상으로 재건 또는 무언가를 일으키는 원인이되는 작은 조각 후에, 과실은 멀리 간다.

잠시 동안 구동되면서 MessedUp.java의 실제 클래스 파일을 확인하기로 결정했습니다. Java Decompiler GUI을 사용하여 thisDisappears이 클래스 파일에 없습니다.

<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을 사용하여 같은 문제를 겪었다.

누구든지이 문제를 해결하는 방법에 대한 경험이나 아이디어가 있습니까?

답변

0

어떤 이유로 든 다른 사용자가 해당 소스와 동일한 폴더에있는 모든 클래스 파일을 사용하여 프로젝트를 VCS로 변환했습니다.제 컴퓨터에서 이클립스는 바이너리를 bin 폴더에 넣습니다. 그래서 다른 사용자의 컴퓨터에있는 소스와 함께 배치 된 이유를 모르겠습니다.

Eclipse에서 생성 한 init 대상은 코드에서 사용하는 자원을 복사하기위한 것입니다. 소스 디렉토리의 java 또는 launch 파일을 복사합니다. 그러나 클래스 파일이 소스 디렉토리에 있었기 때문에 클래스 파일도 복사되었습니다. 그런 다음 build 대상이 실행될 때 이미 새로운 클래스 파일이있는 것으로 보였기 때문에 아무 것도 컴파일하는 것을 방해하지 않았습니다. 그러나 실제로는 이전 코드의 새로운 복사본이었습니다.

해결 방법은 1) 원본 폴더에서 모든 클래스 파일을 제거하고 2) 리소스 복사 코드에 **/*.class의 제외 규칙을 추가하는 것이 좋습니다.

1

이것은 추측입니다.

개미는 이클립스 외부에서 작동하므로 변경된 사항은 이클립스의 대용량 캐시 뷰에 반영되지 않습니다. 아시다시피, 이클립스의 변경 사항은 개미가 사용하는 파일에도 반영되지 않습니다.

나는 프로젝트를 깨끗하게하고, 그 후에 프로젝트를 빌드 한 다음 프로젝트를 새로 고칩니다. 나는 이클립스 내에서이 문제가 있는지 볼 수 있습니다. 그런 다음 개미를 돌리고 (꼭해야한다면) 또 다른 새로 고침을하고 문제가 존재하는지 확인합니다.

다른 프로그램을 사용하기 전에 이클립스 또는 개미 중 하나를 수행 할 때마다 이클립스 프로젝트를 새로 고칩니다.

어떻게되는지 알려주세요.

p.s. java 컴파일러가 메소드를 제거하지 않는다고 믿으십시오. 이상한 일이 있다는 것에 동의하지만, 그렇지 않습니다.

+0

감사합니다. 이것은 직접적으로 문제를 해결하지 못했지만 문제를 발견하게했습니다 (잠시 후 게시 할 예정입니다). –

관련 문제