比方說,我有一個簡單的類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)創建了項目,添加了Main
和A
類,並進行了測試這個。
我需要改變以使其按照預期的方式進行改變?
你是說你改變'.java'文件,gradle認爲它是'UP-TO-DATE'嗎?這是非常有戰鬥力的測試內容,如果gradle的行爲如此,除非你做了'upToDateWhen {true}'或文件不在'src/main/java'之類的東西,否則我會很驚訝。或者,也許這是一個多項目構建,而另一個項目被報告爲「UP-TO-DATE」? –
@ lance-java我在文章中完全沒有提到過,這就是我困惑的原因。 – User1291