2017-06-14 127 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及以上版本)。

相关问题