2015-12-31 44 views
1

我無法讓maven構建一個可以在我的Ubuntu機器上運行的jar。看起來我的.jar找不到.jar,不管我做什麼。帶有混合Java 1.6和1.7名稱空間的Maven ClassNotFoundException

讓我感到困惑的是,在堆棧跟蹤中顯示了一個帶有斜槓命名空間的錯誤,就像在java 1.7中一樣,然後原因是使用了java 1.6命名空間,我不確定這是否可能是相關的解決問題。

爲什麼我在執行.jar時得到ClassNotFound Exception

的pom.xml擁有所有正確的配置,以依賴附加到.jar並創建清單:

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.rwanks.pepper</groupId> 
    <artifactId>wiki-indexer</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>wiki-indexer</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
     <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-core</artifactId> 
      <version>5.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-queryparser</artifactId> 
      <version>5.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-queries</artifactId> 
      <version>5.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-analyzers-common</artifactId> 
      <version>5.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-benchmark</artifactId> 
      <version>5.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.solr</groupId> 
      <artifactId>solr-solrj</artifactId> 
      <version>5.4.0</version> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>2.6</version> 
       <configuration> 
        <archive> 
         <index>true</index> 
         <manifest> 
          <mainClass>com.rwanks.pepper.WikipediaIndexer</mainClass> 
          <addClasspath>true</addClasspath> 
         </manifest> 
         <manifestEntries> 
          <mode>development</mode> 
          <url>${project.url}</url> 
          <key>value</key> 
         </manifestEntries> 
        </archive> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <!-- or whatever version you use --> 
        <source>1.7</source> 
        <target>1.7</target> 

       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>copy-dependencies</id> 
         <phase>process-resources</phase> 
         <goals> 
          <goal>copy-dependencies</goal> 
         </goals> 
         <configuration> 
          <useRepositoryLayout>false</useRepositoryLayout> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 

     </plugins> 
    </build> 
</project> 

堆棧跟蹤:

java -jar target/wiki-indexer-1.0-SNAPSHOT.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/lucene/benchmark/byTask/feeds/NoMoreDataException 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2625) 
    at java.lang.Class.getMethod0(Class.java:2866) 
    at java.lang.Class.getMethod(Class.java:1676) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 
Caused by: java.lang.ClassNotFoundException: org.apache.lucene.benchmark.byTask.feeds.NoMoreDataException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 6 more 

生成MANIFEST.MF

Manifest-Version: 1.0 
Built-By: hunter 
Build-Jdk: 1.7.0_91 
Class-Path: commons-logging-1.2.jar lucene-core-5.4.0.jar lucene-query 
parser-5.4.0.jar lucene-sandbox-5.4.0.jar lucene-queries-5.4.0.jar lu 
cene-analyzers-common-5.4.0.jar lucene-benchmark-5.4.0.jar lucene-cod 
ecs-5.4.0.jar lucene-facet-5.4.0.jar lucene-highlighter-5.4.0.jar luc 
ene-join-5.4.0.jar lucene-memory-5.4.0.jar lucene-spatial-5.4.0.jar i 
cu4j-54.1.jar spatial4j-0.5.jar nekohtml-1.9.17.jar commons-compress- 
1.8.1.jar xercesImpl-2.9.1.jar solr-solrj-5.4.0.jar commons-io-2.4.ja 
r httpclient-4.4.1.jar httpcore-4.4.1.jar httpmime-4.4.1.jar zookeepe 
r-3.4.6.jar stax2-api-3.1.4.jar woodstox-core-asl-4.4.1.jar noggit-0. 
6.jar jcl-over-slf4j-1.7.7.jar slf4j-api-1.7.7.jar 
Created-By: Apache Maven 3.0.5 
Main-Class: com.rwanks.pepper.WikipediaIndexer 
key: value 
url: http://maven.apache.org 
mode: development 
Archiver-Version: Plexus Archiver 

回答

3

這些庫不在預期的類路徑中。

java -jar target/wiki-indexer-1.0-SNAPSHOT.jar那裏你加載應用程序jar在子目錄target/。但清單Class-Path: commons-logging-1.2.jar ...中的類路徑聲明庫應該位於當前目錄中。

下面應該按預期工作

cd target 
java -jar wiki-indexer-1.0-SNAPSHOT.jar 

編輯正如javapapo使用maven-shade-plugin可以防止這樣的問題提到。該插件可以創建一個包含來自所有依賴jar的類的jar文件。

一個簡單的配置可能看起來像。

<plugins> 
     <plugin> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
+1

我可以補充一點,你可以考慮使用[行家遮陽簾插件(https://maven.apache.org/plugins/maven-shade-plugin/),而不是Maven的JAR-插件:) – javapapo

+1

@javapapo如你所說。我爲陰影插件添加了一小段代碼。如果請求者不知道它。 – SubOptimal

+0

@javapapo我後來發現樹蔭插件,但我不確定這是否是最佳的,我有點希望從我的本地.m2文件夾或更輕量級的東西中獲取依賴項,但即使我添加了該文件夾到我的班級路徑我沒有運氣 – perrohunter