2012-01-24 30 views
2

Maven陰影插件忽略Strings中的類/包名稱,這是Java反射的典型特徵。 如果試圖「遮蔽」的庫使用Class.forName(「originalpackagename ....」),則陰影依賴項將無法工作,因爲原始包名稱將保持不變。 相同的故事,類似的代碼Maven陰影插件用於處理java反射的變換器

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." 
}; 

(從碼頭服務器的源代碼複製實例)

也許有一些ResourceTransformer已經可用於Maven的陰影,它取代了字符串源代碼中的原始包/類名稱?

回答

0

很可能這是新行爲,因爲w你問你的問題(我使用的是2.3版本),但陰影插件似乎自動處理Java源文件中的包名稱文字。

但是,對於資源文件,它並不是。例如,如果嘗試對log4j軟件包進行遮蔽,然後從log4j.properties中引用一個記錄器實現類,那麼在運行時會出現異常。我沒有看到任何專門針對陰影插件的內容,但我使用第三方maven-replacer插件修復了此問題。例如:

<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>