如何用Maven把依赖也打到可自动执行的jar里面?

原创 2017年01月13日 00:22:17

最近笔者在用Maven打成一个可执行的jar包(包括main方法)的时候,遇到一个比较诡异的错误,Error: A JNI error has occurred, please check your installation and try again。下面是笔者的Manifest文件。那么如何解决呢?

Manifest-Version: 1.0
Built-By: HenryZhu
Build-Jdk: 1.7.0_55
Class-Path: lib/junit-4.12.jar lib/hamcrest-core-1.3.jar lib/selenium-
 java-3.0.1.jar lib/selenium-chrome-driver-3.0.1.jar lib/selenium-remo
 te-driver-3.0.1.jar lib/selenium-api-3.0.1.jar lib/cglib-nodep-3.2.4.
 jar lib/commons-exec-1.3.jar lib/gson-2.3.1.jar lib/guava-19.0.jar li
 b/jna-platform-4.1.0.jar lib/jna-4.1.0.jar lib/selenium-edge-driver-3
 .0.1.jar lib/selenium-firefox-driver-3.0.1.jar lib/selenium-ie-driver
 -3.0.1.jar lib/selenium-opera-driver-3.0.1.jar lib/selenium-safari-dr
 iver-3.0.1.jar lib/netty-3.5.7.Final.jar lib/selenium-support-3.0.1.j
 ar lib/htmlunit-2.23.jar lib/xalan-2.7.2.jar lib/serializer-2.7.2.jar
  lib/commons-lang3-3.4.jar lib/httpclient-4.5.2.jar lib/httpcore-4.4.
 4.jar lib/httpmime-4.5.2.jar lib/commons-codec-1.10.jar lib/htmlunit-
 core-js-2.23.jar lib/neko-htmlunit-2.23.jar lib/xercesImpl-2.11.0.jar
  lib/xml-apis-1.4.01.jar lib/cssparser-0.9.20.jar lib/sac-1.3.jar lib
 /commons-io-2.5.jar lib/commons-logging-1.2.jar lib/phantomjsdriver-1
 .3.0.jar lib/websocket-client-9.2.15.v20160210.jar lib/jetty-util-9.2
 .15.v20160210.jar lib/jetty-io-9.2.15.v20160210.jar lib/websocket-com
 mon-9.2.15.v20160210.jar lib/websocket-api-9.2.15.v20160210.jar lib/h
 tmlparser-2.1.jar lib/htmllexer-2.1.jar lib/jgroups-3.0.11.Final.jar
Created-By: Apache Maven 3.3.9
Main-Class: com.winneryum.csdn.CSDNAutomationAccess
Archiver-Version: Plexus Archiver

下面是笔者的jar的代码结构,




Manifest文件都是对的。指向的路径也是对的。但是在jar运行的时候,就是找不到jar文件里面的lib目录下的依赖的jar文件。

下面这个是笔者自己的在pom.xml文件中用的Build部分的plugin

<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}/classes/lib</outputDirectory>
							<overWriteReleases>false</overWriteReleases>
							<overWriteSnapshots>false</overWriteSnapshots>
							<overWriteIfNewer>true</overWriteIfNewer>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<archive>
						<manifest>
							<mainClass>com.winneryum.csdn.CSDNAutomationAccess</mainClass>
							<addClasspath>true</addClasspath>  
                            <classpathPrefix>lib/</classpathPrefix>  
						</manifest>
					</archive>
				</configuration>
			</plugin>
		</plugins>
	</build>


当前解决的方式,是用不要把把依赖的jar和可执行的jar放在一起,而是直接把依赖的jar文件,解压缩成class文件,然后和我们自己生成的代码放在一起,正确的pom.xml文件中用的Build部分的plugin应该如下:

<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<version>2.4</version>
				<executions>
					<execution>
						<id>unpack-dependencies</id>
						<phase>prepare-package</phase>
						<goals>
							<goal>unpack-dependencies</goal>
						</goals>
						<configuration>
							<includes>**/*.class</includes>
							<excludes>**/*.properties</excludes>
							<outputDirectory>${project.build.outputDirectory}</outputDirectory>


						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<archive>
						<manifest>
							<mainClass>com.winneryum.csdn.CSDNAutomationAccess</mainClass>
						</manifest>
					</archive>
				</configuration>
			</plugin>
		</plugins>
	</build>



上面只是笔者自己的一种解决方案,如果大家有其他的解决方案,希望能给我留言,我把其也添加到里面来。





版权声明:本文为博主原创文章,未经博主允许不得转载。

git学习------>如何汉化GitLab?

在上一篇博客中,已经正常安装好了GitLab,然而全部界面都是纯英文的,为了照顾整个团队的英文水平,因此这篇博客的目的是将纯英文的GitLab进行汉化。 纯英文界面 第一步: 确认GitLab版本号...

Docker+Jenkins打造自动化测试以及部署升级环境

在项目迭代周期有限的情况下,流程冗长条件复杂的升级测试无法再依赖人工的办法完成,必须借助自动化测试的工具和方法解决这个问题。本文将以Transwarp Data Hub(TDH)的自动化升级测试的...

Maven之——使用本地jar包并打包进war包里面的方法

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/52594602 很显然,这种方法是很不可取的,因为Maven是用来团队合作...

Maven之——使用本地jar包并打包进war包里面的方法

很显然,这种方法是很不可取的,因为Maven是用来团队合作,以及发布开源代码的。而使用本地jar包,则使得Maven丧失了这部分的优点。不 过,我遇到的问题是,我想学习Maven,然后我以前的项目,公...

Maven 的Android项目里面的jar包(本地)、library及libs目录下so文件如何引用

一.jar包引用(本地) 1.普通eclipse结构项目下的 如下图直接放入libs目录下 不做详解 2.maven 结构下 jar包引用方式 在cmd下 用mvn命令把jar安装到本地repos...

Maven管理SSM框架的pom.xml文件配置(自动下载所依赖的jar包)

Maven管理SSM框架的pom.xml文件配置(自动下载所依赖的jar包),无需手动导入jar包,方便安全快捷。...

Maven依赖jar的自动升级配置

Maven应用 Maven自动依赖最新的jar包

maven项目依赖jar包,自动构建失败后使用手工添加

首先,到 http://mvnrepository.com/ 这个网,在搜索栏中输入你要搜索的 JAR 包的关键字来搜索,下面直接贴图:   找到2.1版本的json-lib   拷贝depen...

Maven管理SSM框架的pom.xml文件配置(自动下载所依赖的jar包)

Maven管理SSM框架的pom.xml文件配置(自动下载所依赖的jar包)
  • just3do
  • just3do
  • 2017年03月21日 16:59
  • 1389
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用Maven把依赖也打到可自动执行的jar里面?
举报原因:
原因补充:

(最多只允许输入30个字)