2017-09-25 252 views
0

比方說,我有一個簡單的類gradle - 「compileJava」不能編譯Java,因爲「UP-TO-DATE」?

public class A { 
    public int inc(int k, int i){ 
     System.out.println(i); 
     return 0; 
    } 
} 

而且我把它從Main

public class Main { 
    public static void main(String[] args) { 
     new A().inc(0,7); 
    } 
} 

相應的Java字節碼(javap -c A.class):

public class A { 
    public A(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public int inc(int, int); 
    Code: 
     0: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: iload_2 
     4: invokevirtual #3     // Method java/io/PrintStream.println:(I)V 
     7: iconst_0 
     8: ireturn 
} 

注意iload_2

現在讓我們刪除不必要的參數k

public class A { 
    public int inc(int i){ 
     System.out.println(i); 
     return 0; 
    } 
} 

當然

public class Main { 
    public static void main(String[] args) { 
     new A().inc(7); 
    } 
} 

現在,如果我重新運行該代碼,並,A將被編譯到

public class A { 
    public A(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public int inc(int); 
    Code: 
     0: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: iload_1 
     4: invokevirtual #3     // Method java/io/PrintStream.println:(I)V 
     7: iconst_0 
     8: ireturn 
} 

這是我所期待的。 但是,讓我們說我不想重新運行一切,是在字節級的變化只是有興趣...

gradle compileJava 

然後

javap -c A.class 

它不會改變。

而事實上,在檢查gradle這個輸出,還有一個

:compileJava UP-TO-DATE 

有明確不屬於那裏。

現在,我已經使用Intellij(2017.2.4)嚮導(使用SDK作爲「附加庫和框架」,使用SDK1.8)創建了項目,添加了MainA類,並進行了測試這個。

我需要改變以使其按照預期的方式進行改變?

+2

你是說你改變'.java'文件,gradle認爲它是'UP-TO-DATE'嗎?這是非常有戰鬥力的測試內容,如果gradle的行爲如此,除非你做了'upToDateWhen {true}'或文件不在'src/main/java'之類的東西,否則我會很驚訝。或者,也許這是一個多項目構建,而另一個項目被報告爲「UP-TO-DATE」? –

+0

@ lance-java我在文章中完全沒有提到過,這就是我困惑的原因。 – User1291

回答

0

好的,所以這不是Gradle的問題,而是Intelij的錯誤配置。

創建項目時,

搖籃將編譯到.\build\classes

但「模塊編譯輸出路徑」在項目結構 - >模塊被設置爲.\out\production\classes - 這是從那裏的Intellij將採取字節碼並運行這些類。

這也是重新編譯Gradle時不碰任何文件的地方。

我已經打開a different question關於如何處理,因爲這回答了這個問題。