2017-06-14 148 views
0

我已經在eclipse上開發了一個maven項目並且運行良好。我想從它構建一個jar並從命令提示符運行它。我不想擁有一個包含所有依賴關係的大型jar包。我想要一個帶有項目代碼的小jar,該項目代碼使用'lib'文件夾作爲依賴關係(使用jar文件)和'resources'文件夾作爲屬性文件。JAR文件執行:無法找到/加載主類

插件我在Maven的使用:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.1</version> 
     <configuration> 
      <source>${jdk.version}</source> 
      <target>${jdk.version}</target> 
     </configuration> 

    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>3.0.1</version> 
     <configuration> 
      <archive> 
       <manifest> 
        <addClasspath>true</addClasspath> 
        <classpathLayoutType>custom</classpathLayoutType> 
        <customClasspathLayout>lib/${artifact.artifactId}${artifact.dashClassifier?}-${artifact.version}.${artifact.extension}</customClasspathLayout> 
        <mainClass>mypkg.Main</mainClass> 
       </manifest> 
       <manifestEntries> 
        <Class-Path>. ${project.build.directory}\resources ${project.build.directory}\lib</Class-Path> 
       </manifestEntries> 
      </archive> 
     </configuration> 
    </plugin> 

    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <executions> 
      <execution> 
       <id>copy-dependencies</id> 
       <phase>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> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.6</version> 
     <executions> 
      <execution> 
       <id>copy-resources</id> 
       <phase>validate</phase> 
       <goals> 
        <goal>copy-resources</goal> 
       </goals> 
       <configuration> 
        <outputDirectory>${project.build.directory}\resources</outputDirectory> 
        <resources> 
         <resource> 
          <directory>src/main/resources</directory> 
          <filtering>true</filtering> 
         </resource> 
        </resources> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 

我的主類:

package mypkg; 

import java.io.IOException; 

public class Main { 

    public static void main(String[] args) 
      throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException { 

....... 
....... 
} 
} 

的罐子是越來越與 'META-INF' 文件夾中的清單文件中創建。 清單文件(除去類路徑一些罐條目用於觀察目的):

Manifest-Version: 1.0 
Built-By: userName 
Class-Path: . D:/project2/mypkg/target/ D:/project2/mypkg/target/resources D:/project2/mypkg/target/lib lib/hive-jdbc.jar lib/hive-common.jar lib/commons-lang.jar 
Created-By: Apache Maven 3.3.9 
Build-Jdk: 1.8.0_101 
Main-Class: mypkg.Main 

文件夾結構:

folder- 
     -lib 
      -(all the jar files) 
     -resources 
      -(properties file) 
     -application.jar 

我使用 'Java的罐子application.jar mypkg.Main' 從命令提示。

,但它顯示「錯誤:無法找到或加載主類mypkg.Main」

有人能告訴我是什麼原因造成的錯誤,以及如何解決它?

+0

爲什麼在命令的末尾添加「mypgk.Main」? – Tome

+0

只是爲了確定。即使我沒有顯示相同的錯誤。 –

+0

如果您在內部刪除''配置文件,是否找到主類並抱怨庫類不存在? – Tome

回答

1

終於找到了解決辦法。只需要在清單文件中做一些修改。罐子的版本丟失了。

最終清單文件(除去在類路徑一些罐子條目查看目的)::

Manifest-Version: 1.0 
Built-By: userName 
Class-Path: lib/hive-jdbc-1.1.0.jar lib/hive-common-1.1.0.jar 
Created-By: Apache Maven 3.3.9 
Build-Jdk: 1.8.0_101 
Main-Class: mypkg.Main 

剛一說明:通配符如「LIB/*」沒有在「類路徑」工作Manifest文件中的頭文件(Java 6及以上版本)。

相關問題