重複ファインダー (Java)
重複ファインダー (Java) ビルドランナーは、類似したコードフラグメントをキャッチし、検出された Java コードの繰り返しブロックに関するレポートを提供することを目的としています。 このランナーは IntelliJ IDEA 機能に基づいているため、ランナーを構成するには IntelliJ IDEA プロジェクトファイル (.ipr) またはディレクトリ (.idea) が必要です。
バンドルバージョンに加えて、JetBrains IntelliJ インスペクションおよび DuplicatesEngine の別のバージョンをインストールしたり、 管理 | ツール ページを使用してデフォルトを変更したりすることができます。
重複ファインダー(Java)ランナーは、Maven2 以降でビルドされたプロジェクトで Java の重複を見つけることもできます。
このページには、次の重複ファインダー(Java)ビルドランナーのフィールドに関する参照情報が含まれています。
IntelliJ IDEA プロジェクト設定
オプション | 説明 |
|---|---|
プロジェクトファイルの種類 | TeamCity でコードに対して IntelliJ IDEA インスペクションを実行できるようにするには、IntelliJ IDEA プロジェクトファイル/ディレクトリ、Maven |
プロジェクトへのパス | プロジェクトファイルの種類 で選択したプロジェクトの種類に応じて、ここで指定します。
この情報は、このビルドランナーがプロジェクトの構造を理解するために必要です。 |
| IntelliJ IDEA プロジェクトを使用する場合、このオプションを使用できます。 IntelliJ IDEA では、モジュール設定は |
プロジェクトのチェック / 再解析 | IntelliJ IDEA プロジェクトを使用する場合、このオプションを使用できます。 このボタンをクリックして IntelliJ IDEA プロジェクトを再解析し、JDK のリストなど、プロジェクトからビルド設定を直接インポートします。 |
作業ディレクトリ | ビルドチェックアウトディレクトリと異なる場合は、 ビルド作業ディレクトリへのパスを入力します。 オプションで、チェックアウトディレクトリと異なる場合は指定します。 |
未解決のプロジェクトモジュールとパス変数
このセクションは、IntelliJ IDEA モジュールファイル(.iml )が IPR ファイルから参照された場合に表示されます。
見つからない ;
IPR ファイルで使用されているパス変数の値を入力できます。
このセクションの値をリフレッシュするには、 プロジェクトのチェック / 再解析 をクリックします。
オプション | 説明 |
|---|---|
<パス変数のお名前> | このフィールドは、プロジェクトファイルに IntelliJ IDEA 設定の パス変数ダイアログで定義されたパスマクロが含まれている場合に表示されます。 フィールドに値を設定 で、さまざまなビルドエージェントで使用するプロジェクトリソースへのパスを指定します。 |
プロジェクト JDK
このセクションでは、プロジェクトで検出された JDK のリストを示します。
オプション | 説明 |
|---|---|
JDK ホーム | このフィールドを使用して、プロジェクトの JDK ホームを指定します。 |
JDK Jar ファイルパターン | このリンクをクリックすると、プロジェクト JDK の jar ファイルのテンプレートを定義できるテキスト領域が開きます。 Ant ルールを使用して、jar ファイルパターンを定義します。 Linux および Windows オペレーティングシステムでは、デフォルト値が使用されます。
jre/lib/*.jar
macOS の場合は、次の行を使用してください。
lib/*.jar
../Classes/*.jar
|
IDEA ホーム | プロジェクトで IDEA JDK を使用している場合は、IDEA ホームディレクトリの場所を指定します。 |
IDEA Jar ファイルパターン | このリンクをクリックしてテキスト領域を開き、IDEA JDK の jar ファイルのテンプレートを定義できます。 |
- JDK
JDK を選択してください。 このセクションは利用可能なオプションを詳しく述べています。 デフォルトは
JAVA_HOME環境変数またはエージェント自身の Java です。- JDK ホームパス
上で <カスタム> が選択されている場合に、このオプションを使用できます。 このフィールドを使用して、ビルドの実行に使用するカスタム JDK へのパスを指定します。 フィールドが空白の場合、JDK Home へのパスは、エージェントマシン上の
JAVA_HOME環境変数、または ビルドエージェント構成ファイル (ビルドエージェント.プロパティ) で指定されたenv.JAVA_HOME 環境変数プロパティから読み取られます。 これらの値が指定されていない場合、TeamCity はビルドエージェントプロセス自体の Java ホームを使用します。- JVM コマンドラインパラメーター
追加の JVM コマンドラインパラメーターを使用すると、初期および最大ヒープサイズの設定、追加のログの有効化、必要なバイトコード検証モードの選択などを行うことができます。
標準 (
-で始まる、たとえば-verbose:[class|module|gc|jni]または--dry-run) と非標準 (-Xで始まる、たとえば-Xmx<サイズ>または-XstartOnFirstThread) の両方の JVM オプションを指定できます。複数のコマンドラインパラメーターを指定するには、区切り文字としてスペースを使用します。 例:
-verbose:gc -Xdiag -Xcomp -Xmx512m -Xms256m
Java パラメーター
重複ファインダー設定
オプション | 説明 |
|---|---|
テストソース | このオプションがチェックされている場合、テストソースは重複分析に含まれます。 |
包含 / 除外パターン | オプションで、重複分析を実行するソーススコープを制限するように指定します。 詳細については、以下のセクションを参照してください。 |
脱メタルレベル | これらのオプションを使用して、繰り返しコードの断片を検索するときにソースコードのどの要素を区別するかを定義します。 コードフラグメントは、構造的には類似しているが、異なる変数、フィールド、メソッド、型、またはリテラルを含む場合、重複していると見なすことができます。 以下のサンプルを参照してください。 |
変数を区別する | このオプションがチェックされていると、異なる変数名を持つ類似の内容は異なるものとして認識されます。 このオプションがチェックされていない場合、そのような内容は重複していると認識されます。
public static void main(String[] args) {
int i = 0;
int j = 0;
if (i == j) {
System.out.println("sum of " + i + " and " + j + " = " + i + j);
}
long k = 0;
long n = 0;
if (k == n) {
System.out.println("sum of " + k + " and " + n + " = " + k + n);
}
}
|
フィールドを区別する | このオプションがチェックされている場合、異なるフィールド名を持つ類似の内容は異なるものとして認識されます。 このオプションがチェックされていない場合、そのような内容は重複していると認識されます。
myTable.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
/*.....**/
});
myTree.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
/*.....**/
});
|
方法を区別する | このオプションがチェックされている場合、類似した構造のメソッドは異なるものとして認識されます。 このオプションがチェックされていない場合、そのようなメソッドは重複していると認識されます。 この場合、抽出して再利用することができます。 初期バージョン
public void buildCanceled(Build build, SessionData data) {
/* ... **/
for (IListener listener : getListeners()) {
listener.buildCanceled(build, data);
}
}
public void buildFinished(Build build, SessionData data) {
/* ... **/
for (IListener listener : getListeners()) {
listener.buildFinished(build, data);
}
}
メソッドを区別せずにコードの重複を分析した後、重複したフラグメントを抽出できます。
public void buildCanceled(final Build build, final SessionData data) {
enumerateListeners(new Processor() {
public void process(final IListener listener) {
listener.buildCanceled(build, data);
}
});
}
public void buildFinished(final Build build, final SessionData data) {
enumerateListeners(new Processor() {
public void process(final IListener listener) {
listener.buildFinished(build, data);
}
});
}
private void enumerateListeners(Processor processor) {/* ... **/
for (IListener listener : getListeners()) {
processor.process(listener);
}
}
private interface Processor {
void process(IListener listener);
}
|
種類を区別する | このオプションがチェックされている場合、異なる型名を持つ類似のコードは異なるものとして認識されます。 このオプションがチェックされていない場合、そのようなコードフラグメントは重複していると認識されます。
new MyIDE().updateStatus()
new TheirIDE().updateStatus()
|
リテラルを区別する | このオプションをオンにすると、リテラルが異なる類似のコード行は異なると見なされます。 このオプションがチェックされていない場合、そのような行は重複として認識されます。
myWatchedLabel.setToolTipText("Not Logged In");
myWatchedLabel.setToolTipText("Logging In...");
|
以下の複雑さで重複を無視します | ソースコードの複雑さは、ステートメント、式、宣言、メソッド呼び出しの量によって定義されます。 それぞれの複雑さはそのコストによって定義されます。 ソースコードフラグメントのこれらすべての要素のコストをまとめると、全体的な複雑さが生じます。 このフィールドを使用して、重複を検出するときに考慮するソースコードの最低レベルの複雑さを指定します。 意味のある結果を得るためには、値 10 から始めてください。 |
以下の複雑さを持つ重複した部分式を無視します | このフィールドを使用して、重複を検出するときに考慮する副次式の最低レベルの複雑さを指定します。 |
部分式が抽出できるかどうかを確認 | このオプションをチェックすると、重複した部分式を抽出することができます。 |
包含 / 除外パターンは、改行で区切られた形式の一連の規則です。
パターンがこれらの規則を満たさなければならない場合:
必ず
**または*のいずれかで終わる必要があります (これにより、パターンは実質的にディレクトリレベルのみに制限され、ファイルレベルのパターンはサポートされません)モジュールへの参照は
[モジュールのお名前]/<モジュール内のパス>として含めることができます。パターン処理に関する注意事項:除外は包含よりも優先されます
include パターンが指定されている場合、これらのパターンに一致するディレクトリだけが含まれ、その他のすべてのディレクトリは除外されます。
"include" パターンは特別な振る舞いをします(根本的な制限による): それは指定されたディレクトリと指定されたディレクトリの上のディレクトリに直接存在するすべてのファイルを含みます。
例: