2012-01-24 9 views
2

Maven shade Pluginは、文字列のクラス/パッケージ名を無視します。これはJavaのリフレクションでは一般的です。 "シェード"しようとしているライブラリがClass.forName( "originalpackagename ....")を使用している場合、元のパッケージ名は変更されないため、影付きの依存関係は機能しません。Maven Shade Plugin for Java reflection

servlet.addServletWithMapping("org.mortbay.jetty.servlet.DefaultServlet", 
    URIUtil.SLASH); 

とさらに悪いことにするようなコードで 同じ話:

private String[] _serverClasses = { 
    "-org.mortbay.jetty.plus.annotation.",  // don't hide 
    "-org.mortbay.jetty.plus.jaas.",    // don't hide 
    "-org.mortbay.jetty.plus.naming.",   // don't hide 
    "-org.mortbay.jetty.plus.jaas.",    // don't hide 
    "-org.mortbay.jetty.servlet.DefaultServlet", // don't hide 
    "org.mortbay.jetty.", 
    "org.slf4j." 
}; 

(例は桟橋サーバーのソースコードからコピー)

多分Mavenのシェードのためにすでに利用可能ないくつかのResourceTransformerがあり、これは文字列のソースコード内の元のパッケージ/クラス名を置き換えますか?

答えて

0

これはおそらく、wあなたはあなたの質問をしました(私はバージョン2.3を使用しています)が、シェード・プラグインはJavaソース・ファイル内のパッケージ名リテラルを自動的に処理するように見えます。

ただし、リソースファイルの場合は表示されません。たとえば、log4jパッケージをシェードし、log4j.propertiesからロガー実装クラスを参照すると、実行時に例外が発生します。私は陰影のプラグインのために特に何も表示されませんが、サードパーティのmaven-replacer-pluginを使用してこの問題を修正しました。例:

<plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>replacer</artifactId> 
    <version>1.5.3</version> 
    <executions> 
    <execution> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>replace</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <basedir>${project.build.directory}</basedir> 
    <includes> 
     <include>classes/*.properties</include> 
    </includes> 
    <replacements> 
     <replacement> 
     <token>org.</token> 
     <value>my-shaded-package-root.org.</value> 
     </replacement> 
    </replacements> 
    </configuration> 
</plugin> 
関連する問題