2014-10-01 39 views
3

的pom.xml:如何將tools.jar包含到uberjar中(使用maven-shade-plugin)?

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>test</groupId> 
    <artifactId>test</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>com.sun</groupId> 
      <artifactId>tools</artifactId> 
      <version>1.7</version> 
      <scope>system</scope> 
      <systemPath>${java.home}/../lib/tools.jar</systemPath> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>2.3</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          <transformers> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
            <mainClass>test.Test</mainClass> 
           </transformer> 
          </transformers> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

mvn install成功完成(即Maven的構建過程中看到tools.jar依賴),但在執行我

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac/api/JavacScope 
    at test.Test.main(Test.java:24) 
Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.api.JavacScope 
... 
+0

爲什麼需要什麼?這不會讓你的uberjar JVM具體嗎?爲什麼不在運行時發現或使用替代嵌入式javac(如eclipse-jdt)? – 2014-10-01 17:48:53

+0

@JoakimErdfelt好的,如何在運行時發現?在實際問題中,tools.jar是一個遞歸dep,因此我無法替換它。 – leventov 2014-10-01 17:52:54

回答

1

行家蔭插件假定系統的依賴關係存在和它實際上並沒有將它們包含在fat-jar中

快速變通解決方法是將tools.jar安裝到您的Maven存儲庫中,並將其作爲編譯作用域依賴項引用

更好的解決方法是使用maven-assembly-plugin和tools.jar中包括作爲<file>

+0

它已經存在。或者在pom中,我應該添加這個dep? – leventov 2014-10-01 17:45:44

+0

已更新的回答 2014-10-01 17:54:05

+0

謝謝安裝tools.jar和包括普通的dep幫助。 – leventov 2014-10-01 18:19:13

1

大多數<scope>system</scope>依賴不會被提供給插件。

此外,在uberjar中包括tools.jar在JVM的新版本中並不是非常可移植的。如果你有一個超級控制和有限的部署環境,那很好,但通常它更好地發現tools.jar並使用它。

下面是一個example from the maven-javadoc-plugin本身(它通過查找的tools.jar,然後驗證該活動的類加載器已經從班的tools.jar)

在你的情況,而不是尋找com.sun.tools.doclets.Taglet,你會尋找com.sun.tools.javac.api.JavacScope來驗證有效的環境。

從那裏將是微不足道的建立與uberjar +的tools.jar一個新的ClassLoader,然後執行你從有效Thread.currentThread().setContextClassLoader()範圍

相關問題