2016-11-02 22 views
0

Glassfishに配布されたMavenによって管理されるJavaプロジェクトがあります。"未使用"ランタイム依存性の安全な除去

私の質問は、実行時の依存関係になる可能性があるmaven-managed依存関係を安全に削除するにはどうすればよいですか?

私は、従来のプロジェクトで使用されていない依存関係を識別するためにmaven dependency pluginを使用しました:出力は次のようになります

mvn dependency:analyze -DignoreNonCompile=true 

[INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ MyProject --- 
[WARNING] Used undeclared dependencies found: 
[WARNING] commons-collections:commons-collections:jar:3.2:compile 
[WARNING] commons-beanutils:commons-beanutils:jar:1.7.0:compile 
[WARNING] org.apache.cxf:cxf-core:jar:3.1.3:compile 
[WARNING] junit:junit:jar:4.11:test 
[WARNING] org.springframework:spring-test:jar:4.1.6.RELEASE:test 
[WARNING] com.fasterxml.jackson.core:jackson-databind:jar:2.4.3:compile 
[WARNING] ca.uhn.hapi:hapi-base:jar:2.2:compile 
[WARNING] org.apache.camel:camel-core:jar:2.15.3:compile 
[WARNING] Unused declared dependencies found: 
[WARNING] org.apache.camel:camel-cxf:jar:2.15.3:compile 
[WARNING] org.apache.cxf:cxf-rt-bindings-soap:jar:3.1.3:compile 
[WARNING] org.apache.camel:camel-jms:jar:2.15.3:compile 
[WARNING] net.sf.saxon:Saxon-HE:jar:9.5.1-5:compile 
[WARNING] org.apache.camel:camel-mina2:jar:2.15.3:compile 
[WARNING] com.google.code.gson:gson:jar:2.7:compile 
[WARNING] org.springframework:spring-jms:jar:4.2.1.RELEASE:compile 
[WARNING] org.springframework:spring-web:jar:4.2.1.RELEASE:compile 
[WARNING] org.springframework:spring-orm:jar:4.2.1.RELEASE:compile 
[WARNING] org.apache.cxf:cxf-rt-frontend-jaxws:jar:3.1.3:compile 
[WARNING] org.apache.camel:camel-spring-ws:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-saxon:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-servlet:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-hl7:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-spring:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-ftp:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-velocity:jar:2.15.3:compile 
[WARNING] ch.qos.logback:logback-classic:jar:1.1.2:compile 
[WARNING] org.apache.cxf:cxf-rt-transports-http:jar:3.1.3:compile 
[WARNING] org.apache.camel:camel-ejb:jar:2.15.3:compile 
[WARNING] org.slf4j:slf4j-api:jar:1.7.7:compile 

私は、これらの「未使用」の依存関係を削除したいですしかし、私はアプリケーションが実行時に失敗することを心配しています。

ignoreNonCompileオプションを有効にすると、「未使用の依存解析の実行時/提供済み/テスト/システムのスコープを無視する」ことが約束されていますが、依存関係の範囲を設定することは、自動的に)、私はこれらの "未使用"の依存関係は実際にランタイム依存性ではないことが確信できるとは思いません。

Camel DSLのために、maven依存プラグインが "未使用"のCamel依存関係を誤って識別する可能性が特に高いため、この質問apache-camelを具体的にタグ付けした理由があります。私は限りMavenのが懸念しているとして、これは単なる文字列なので、それはプロジェクトが本当の依存性を持っていることを気づいていないことを考える

from("ftp://[email protected]?password=secret&ftpClient.dataTimeout=30000").to("bean:foo"); 

:たとえば、camel-ftpコンポーネントは次のようになりDSLで使用されていますcamel-ftpコンポーネントにあります。

私の質問は、どのように安全に実行時の依存関係になる可能性のある依存関係を削除できますか?

+1

ProGuardのような、バイトコードレベルの依存性を分析し、未使用のクラスをスローするシステムを使用してください。 –

+0

アイデアのおかげで@SeanPatrickFloyd:いいです! ProGuardは、特に大きなプロジェクトのために、学習と構成に多少の時間を要します。私は仕事を恐れないが、残念ながら私はまだ私のpom.xmlファイルをクリーンアップしたいと思う:私は最初に未使用の依存関係を含めたくない。 – DavidS

+0

私は理解しますが、その部分はずっと難しいです。おそらくProGuardを分析のためだけに使用し、その出力を使用して保持する必要のある依存関係を検出することができますか? –

答えて

1

Camelは、camel-ftpのような具体的なクラスではなく、クラスを動的にインスタンス化し、インターフェイスを使用しています。この場合、バイトコードツールは依存関係の分析には役に立たない。

解決策は、幸せなパスとエラーパスのシナリオをカバーする包括的な単体テストセットを用意し、宣言されたMaven依存関係のスリムなセットに対してテストすることです。

本当に依存関係を整理したい場合は、* -springコンポーネントの使用を排除し、青写真またはJava DSLを使用してください。 Springコンポーネントは過渡的な依存関係が多い傾向があります。

+0

ありがとうMatt!だから、 'dependency:analyze'は恐らくCamelに関して多くの誤検出を返すだろうし、ProGuardはバイトコードツールであるため、うまくいかないだろう。私は包括的なユニットテストスイートを持っていればいいのに、追加することはできません。私はリファクタリングの注目を他のところに向けていくつもりだと思う。 – DavidS

関連する問題