- 问题:
在linux中maven进行打包时出现java.lang.NoClassDefFoundError的错误,在idea中不会出现此类问题
原因:
对比linux中打的jar包和idea中打的jar包,发现linux中的jar包明显小于idea的jar包
可见在打jar包时没有将依赖包导入
解决方案:
使用Maven Assembly插件jar-with-dependencies将它打包为一个jar
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.hbase2Redis.Hbase2Redis</mainClass>
//这个是打包程序的主程序类
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 问题:
no main manifest attribute, in xxx.jar
原因:
一般情况下,java 打包成 jar 包需要在 MANIFEST.MF 中指定 Main-Class 项,以便运行 java -jar xxx.jar 时找到对应的主类。
因为-jar的含义就是后面跟的jar包是有main class可独立运行,所以需要在打包成jar包时指定这个类;否则,需要在执行的时候手动指定。
解决方案1:
在pom文件中指定main class
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>ParserLog</mainClass>(指定main class)
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
解决方案2:
java -cp SPARQLParser.jar ParserLog