2011-12-23 7 views
38

C#では、プロジェクトをビルドする2つのモードがあります:DebugRelease、Javaにも同じことがあるのだろうかと思います。私はIntelliJ IDEAをJava IDEとして使用していますが、これまでのところ、VS IDEのようなビルド・モードを設定する場所は見ていませんでした。JavaにはC#のような 'Debug'と 'Release'ビルドモードがありますか?

+0

あなたは** java using assert **のようなものをウェブで検索しましたか? IDEAに関しては、 /bin/idea.exe.vmoptionsを調べると、 '-ea'設定が存在する場合、' Debug'モードで動作する可能性が最も高いでしょう。 – gnat

+0

@gnat、はい、あります'-ea'は' idea.exe.vmoptions'で設定します。しかし、アーチファクト(jarファイル)をビルドするとき、アーチファクトを持つ 'Debug'モードではどうでしょうか? vmoptionsファイル内の – JatSing

+1

、 '-ea'はIDEAの実行方法に影響を与えます(あなたが知っているJavaアプリケーションですか? jarファイルでは、 '-ea'を指定するか省略することで、実行時にモードを管理します。私が書いたように、Webでjavaを検索すると、 – gnat

答えて

32
javac 
    -g       Generate all debugging info 
    -g:none     Generate no debugging info 
    -g:{lines,vars,source}  Generate only some debugging info 

あなたがコンパイルされたクラスでのデバッグシンボルを含めるように選択することができます(これがデフォルトです)、またはそうではないし。それをしないとあまり効果はありません。 jarファイルはa little smallerになりますが、パフォーマンス上のメリットは最小限に抑えられます(存在する場合)。これらのシンボルがなければ、スタックトレースに行番号が表示されなくなります。 additional symbols with local variable namesを含めることもできます(デフォルトでは、ソースファイル名と行番号のみがあります)。

java 
    -ea[:<packagename>...|:<classname>] 
    -enableassertions[:<packagename>...|:<classname>] 
        enable assertions 

また、開発およびテスト時に便利な場合があり、実行時にアサーションを(デフォルトはオフ)、有効にすることができます。これはパフォーマンス上の影響があります(問題のコードが実際にアサーションを使用していた場合、私はuncommonだと思います)。

これらの設定に関係なく、JVMでは常にデバッガを接続できます。

Javaには、いくつかの外部設定に基づいて完全に異なるコードをコンパイルする条件付きコンパイルがありません。あなたが得ることができる最も近いものは、あなたのコードのどこかにpublic static final boolean DEBUG_BUILD = true;のようなものであり、ifステートメントでそれを使用します。これは、実際には到達不能になるコードをコンパイラに除外させますが、ソースコードでこの定数を設定する必要があります。

+1

のチュートリアルがたくさんあるので、C#の '#ifdebug'のような前処理に' public static final boolean DEBUG_BUILD'をするのですか? – JatSing

+3

@JatSing:直接ではありません。あなたは、コンパイラを起動する前に値を更新する何らかの種類のスクリプトを持つことができます。あるいは、Constants.javaとその2つのバージョンを用意し、それらのいずれかのコンパイルクラスパスを設定します。しかし、公式のツールチェーンには何もありません。 – Thilo

4

あなたは、さまざまな種類のビルドを私が推測する別のものでコンパイルするように求めています。たとえば、Debug.WriteLineとConsole.WriteLineがあるとします。

"いいえ、Javaはその機能に完全に一致しません。アスペクトを使用することも、IOCコンテナを使用してさまざまな実装クラスを注入することもできます。次の質問からこれを盗んだ:Conditional Java compilation

(あなたのために他の素敵な答えがそこにそこにいる)

13

それはすべてを解放するためにJavaで通常の練習でデバッグすることができた方法です。難読化を必要とするいくつかのプロジェクトでは、リリースビルドを持つことができましたが、私はJavaを開発して12年目にこれを見たことがありません。

アサーションやデバッグメッセージなどは、通常は本番インスタンスでは実行時にオフになりますが、必要に応じていつでも(動的にでも)オンにすることができます。

IMHO同一のソースではなく、同じJARで、すべての環境で同じビルドを使用することをお勧めします。これは、テストで動作する場合、プロダクションで動作し、プロダクションで問題がある場合は、テストで再生成できるという最高のチャンスを与えます。

このように多くのJavaコードが記述されているので、JITは決して呼び出されないデッドコードの最適化に非常に優れています。 IMHOは、Java OutがC++を実行するマイクロベンチマークのほとんどを、ベンチマークが何もせず、これを検出するのにJITが優れている場合です。 IMHO、C++は、開発者が何もしないコードを書かないほどスマートであると想定しています。

+1

"Javaを開発して12年目にこれを見たことがない"。私にとっては、これはあなたの答えの中で最も関連性の高い部分です.HFT用Java(!)を書いているようです。これは、すべてのデバッグ情報を含むようにJavaコードをコンパイルすることは、JVM JITを行うかどうかを妨げるかどうかを意味しますか?はいと思っていますが、確認を求めます。 – kevinarpe

関連する問題