2017-09-25 2 views
0

のは、私は単純なクラスgradle - "compileJava"は "UP-TO-DATE"のためJavaをコンパイルしていませんか?

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

を持っていると私は、対応するJavaバイトコード(javap -c A.classMain

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

から呼び出してみましょう:

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)ウィザード(Javaを「追加のライブラリとフレームワーク」として、SDK1.8を使用しているgradleプロジェクト)でプロジェクトを作成し、MainAクラスを追加してテストしましたこの。

この作業を想定どおりに行うためには、何を変更する必要がありますか?

+2

あなたは '.java'ファイルを変更して、gradleはそれが' UP-TO-DATE'だと言っていますか?'upToDateWhen {true}'のような愚かなことや、 'src/main/java'にないファイルでなければ、これはかなりうまくいくでしょう。それとも、マルチプロジェクトビルドで、別のプロジェクトが「UP-TO-DATE」として報告されているのでしょうか? –

+0

@ lance-java私は文字通り私の記事で言及していないことは何もしていない、それは私が混乱している理由です。 – User1291

答えて

0

これはGradleの問題ではなく、Intelijの誤った設定です。

のGradleは、.\build\classesにコンパイル

が、プロジェクト構造の「モジュールが出力パスをコンパイル」し、

プロジェクトを作成 - >モジュールは.\out\production\classesに設定されている - のIntelliJが取るところからですクラスを実行します。

また、Gradleを再コンパイルするとファイルには触れません。

私はこれを処理する方法についてa different questionを開いています。これはこの質問に答えます。

関連する問題