2017-02-24 61 views
0

我正在嘗試創建一個jar以發送給同事進行測試。我的程序在Eclipse IDE上正常工作。但是,當我嘗試使用mvn install和mvn包將其編譯到jar中時,當我嘗試運行jar時,出現以下錯誤: [NoClassDefFound] [1](點擊鏈接查看截圖) 。Maven Shade插件 - NoClassDefFound

這裏是我的POM文件:

http://maven.apache.org/xsd/maven-4.0.0.xsd「> 4.0.0

<groupId>org.geotools.tutorial.tutorialCerto</groupId> 
<artifactId>tutorialCerto</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

<name>tutorial</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <geotools.version>15.1</geotools.version> 
    <geotools.version>17-SNAPSHOT</geotools.version> 
</properties> 

<dependencies> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-process</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-shapefile</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-swing</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-epsg-hsql</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-geotiff</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-image</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-wms</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-swing</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
</dependencies> 
<repositories> 
    <repository> 
     <id>maven2-repository.dev.java.net</id> 
     <name>Java.net repository</name> 
     <url>http://download.java.net/maven/2</url> 
    </repository> 
    <repository> 
     <id>osgeo</id> 
     <name>Open Source Geospatial Foundation Repository</name> 
     <url>http://download.osgeo.org/webdav/geotools/</url> 
    </repository> 
    <repository> 
     <snapshots> 
      <enabled>true</enabled> 
     </snapshots> 
     <id>boundless</id> 
     <name>Boundless Maven Repository</name> 
     <url>http://repo.boundlessgeo.com/main</url> 
    </repository> 
</repositories> 
<build> 

    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <encoding>UTF-8</encoding> 
       <target>1.8</target> 
       <source>1.8</source> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>3.0.0</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <!-- This bit sets the main class for the executable jar as you otherwise --> 
          <!-- would with the assembly plugin          --> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <manifestEntries> 
            <Main-Class>org.geotools.tutorial.tutorialCerto.ImageLab</Main-Class> 
           </manifestEntries> 
          </transformer> 
          <!-- This bit merges the various GeoTools META-INF/services files   --> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

我將非常感激,如果有人可以幫助我弄清楚發生了什麼。提前

謝謝!

EDIT 2

添加以下代碼只是對我的程序測試目的:

包com.br.iacit.tutorialdoJar;

public class App { 
public static void main(String[] args) 
{  System.out.println(com.sun.media.imageioimpl.common.PackageUtil.getVendor()); 
} 

}

在Eclipse IDE中它顯示了Sun Microsystems公司然而,在我的jar文件它打印空。也許這跟它有關係?

+0

您正在定義兩個同名的屬性 – nandsito

+0

您的意思是 15.1 17-SNAPSHOT?如果是這樣,這是API默認:) –

+0

是的,只嘗試使用其中的一個(這是Maven會做的)。 –

回答

1

我通過添加下面的屬性到我的POM文件解決我的問題:

<manifestEntries> 
<Main-Class>com.br.iacit.tutorialdoJar.ImageLab</Main-Class> 
<Specification-Title>Java Advanced Imaging Image I/O Tools</Specification-Title> 
<Specification-Version>1.1</Specification-Version> 
<Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor> 
<Implementation-Title>com.sun.media.imageio</Implementation-Title> 
<Implementation-Version>1.1</Implementation-Version> 
<Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor> 
</manifestEntries> 

這是我最後的POM文件:

HTTP: //maven.apache.org/xsd/maven-4.0.0.xsd「> 4.0.0

<groupId>com.br.iacit</groupId> 
<artifactId>tutorialdoJar</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

<name>tutorialdoJar</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <geotools.version>17-SNAPSHOT</geotools.version> 
</properties> 

<dependencies> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-process</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-shapefile</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-swing</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-epsg-hsql</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-geotiff</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-image</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-wms</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-swing</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.github.jai-imageio</groupId> 
     <artifactId>jai-imageio-core</artifactId> 
     <version>1.3.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.geotools</groupId> 
     <artifactId>gt-imageio-ext-gdal</artifactId> 
     <version>${geotools.version}</version> 
    </dependency> 
</dependencies> 
<repositories> 
    <repository> 
     <id>maven2-repository.dev.java.net</id> 
     <name>Java.net repository</name> 
     <url>http://download.java.net/maven/2</url> 
    </repository> 
    <repository> 
     <id>osgeo</id> 
     <name>Open Source Geospatial Foundation Repository</name> 
     <url>http://download.osgeo.org/webdav/geotools/</url> 
    </repository> 
    <repository> 
     <snapshots> 
      <enabled>true</enabled> 
     </snapshots> 
     <id>boundless</id> 
     <name>Boundless Maven Repository</name> 
     <url>http://repo.boundlessgeo.com/main</url> 
    </repository> 
</repositories> 
<build> 

    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <encoding>UTF-8</encoding> 
       <target>1.8</target> 
       <source>1.8</source> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>3.0.0</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <!-- This bit sets the main class for the executable jar as you otherwise --> 
          <!-- would with the assembly plugin --> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <manifestEntries> 
            <Main-Class>com.br.iacit.tutorialdoJar.ImageLab</Main-Class> 
            <Specification-Title>Java Advanced Imaging Image I/O Tools</Specification-Title> 
            <Specification-Version>1.1</Specification-Version> 
            <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor> 
            <Implementation-Title>com.sun.media.imageio</Implementation-Title> 
            <Implementation-Version>1.1</Implementation-Version> 
            <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor> 
           </manifestEntries> 
          </transformer> 
          <!-- This bit merges the various GeoTools META-INF/services files --> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

+0

哪一個清單?我想你在項目中創建的一個? – Adonis

+0

檢查標記。我添加了一些屬性。之前,我只有規範。 –

1

我認爲你缺少在類路徑依賴,糾正這一點,你可以使用maven依賴插件:

 <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>prepare-package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.directory}/lib</outputDirectory> 
         <overWriteReleases>false</overWriteReleases> 
         <overWriteSnapshots>false</overWriteSnapshots> 
         <overWriteIfNewer>true</overWriteIfNewer> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    </build> 

那麼你就需要還到類路徑添加到您的清單,遮陽我認爲你需要在<ManifestEntries>添加以下內容:

<Class-Path>${project.build.directory}/lib</Class-Path> 

編輯:不夠公平如果你不需要陰影插件,我可以建議你的是下面的POM,它採用了簡單的plugi N到編譯depedencies的maven dependency plugin

<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>org.test.whatever</groupId> 
    <artifactId>shade-tester</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>shade-tester</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <geotools.version>15.1</geotools.version> 
    </properties> 

    <dependencies> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-process</artifactId> 
      <version>${geotools.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-shapefile</artifactId> 
      <version>${geotools.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-swing</artifactId> 
      <version>${geotools.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-epsg-hsql</artifactId> 
      <version>${geotools.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-geotiff</artifactId> 
      <version>${geotools.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-image</artifactId> 
      <version>${geotools.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-wms</artifactId> 
      <version>${geotools.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-swing</artifactId> 
      <version>${geotools.version}</version> 
     </dependency> 
    </dependencies> 
    <repositories> 
     <repository> 
      <id>maven2-repository.dev.java.net</id> 
      <name>Java.net repository</name> 
      <url>http://download.java.net/maven/2</url> 
     </repository> 
     <repository> 
      <id>osgeo</id> 
      <name>Open Source Geospatial Foundation Repository</name> 
      <url>http://download.osgeo.org/webdav/geotools/</url> 
     </repository> 
     <repository> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
      <id>boundless</id> 
      <name>Boundless Maven Repository</name> 
      <url>http://repo.boundlessgeo.com/main</url> 
     </repository> 
    </repositories> 
    <build> 

     <plugins> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <encoding>UTF-8</encoding> 
        <target>1.8</target> 
        <source>1.8</source> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>copy-dependencies</id> 
         <phase>prepare-package</phase> 
         <goals> 
          <goal>copy-dependencies</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${project.build.directory}/lib/</outputDirectory> 
          <overWriteReleases>false</overWriteReleases> 
          <overWriteSnapshots>false</overWriteSnapshots> 
          <overWriteIfNewer>true</overWriteIfNewer> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
<!--    Build an executable JAR --> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>3.0.2</version> 
       <configuration> 
        <archive> 
         <manifest> 
          <addClasspath>true</addClasspath> 
          <classpathPrefix>lib/</classpathPrefix> 
          <mainClass>org.test.whatever.shade_tester.App</mainClass> 
         </manifest> 
        </archive> 
        <excludes> 
         <exclude>**/*log4j*</exclude> 
        </excludes> 
       </configuration> 
      </plugin> 
      <!-- <plugin> --> 
      <!-- <groupId>org.apache.maven.plugins</groupId> --> 
      <!-- <artifactId>maven-shade-plugin</artifactId> --> 
      <!-- <version>3.0.0</version> --> 
      <!-- <executions> --> 
      <!-- <execution> --> 
      <!-- <phase>package</phase> --> 
      <!-- <goals> --> 
      <!-- <goal>shade</goal> --> 
      <!-- </goals> --> 
      <!-- <configuration> --> 
      <!-- <transformers> --> 
      <!-- This bit sets the main class for the executable jar as you otherwise --> 
      <!-- would with the assembly plugin --> 
      <!-- <transformer --> 
      <!-- implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> --> 
      <!-- <manifestEntries> --> 
      <!-- <Main-Class>org.test.whatever.shade_tester.App</Main-Class> --> 
      <!-- <Class-Path>lib/</Class-Path> --> 
      <!-- </manifestEntries> --> 
      <!-- </transformer> --> 
      <!-- This bit merges the various GeoTools META-INF/services files --> 
      <!-- <transformer --> 
      <!-- implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" 
       /> --> 
      <!-- </transformers> --> 
      <!-- </configuration> --> 
      <!-- </execution> --> 
      <!-- </executions> --> 
      <!-- </plugin> --> 
     </plugins> 
    </build> 
</project> 
+0

感謝您的回答。現在它給了我錯誤,它找不到主要類,但是,它在我的包上。我已經更新了我的答案! –

+0

很奇怪,這種配置在我的情況下效果很好......也許你可以嘗試將你的maven shade版本更新到3.0.0。當你運行mvn時,你是否先清理? (即mvn clean package或mvn clean install) – Adonis

+0

我的pom文件已經是3.0.0。 :(我運行mvn clean package,然後mvn包 –

相關問題