下面是“IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解)”的完整攻略。
问题背景
在非Maven项目中,有时会使用第三方依赖的jar包,运行时需要将这些jar包添加到classpath中。但是,如果要将这些依赖打成一个jar包,传递给其他人使用,就会遇到问题:打出的jar包无法运行,因为缺少第三方依赖的jar包,无法加载类。
解决方案
为了解决这个问题,我们需要将所有的代码和依赖打包成一个可执行的jar包,即所谓的“可执行jar包”或“fatjar”。
第一步:导出jar包
首先,在IDEA中,我们需要导出一个jar包,在File
-> Project Structure
中打开Project Structure
面板。在弹出的对话框中,选择左侧的Artifacts
选项卡,然后点击右上角的加号,选择JAR
-> From modules with dependencies
。填写JAR files from libraries
和Main Class
选项,并点击OK
。
第二步:配置构建选项
然后,在File
-> Settings
中打开Settings
面板。在弹出的对话框中,选择左侧的Build, Execution, Deployment
选项卡,然后选择Build Tools
-> Maven
-> Runner
。勾选Delegate IDE build/run actions to Maven
,然后点击OK
保存设置。
第三步:编译项目
接下来,我们需要在终端中使用Maven构建项目。首先,在IDEA中打开终端,输入以下命令来检查您的系统是否正确安装Java和Maven:
java -version
mvn -version
然后,在项目根目录下,执行以下命令进行编译:
mvn clean compile package
如果编译成功,会在项目的target
目录下生成一个名为<artifactId>-<version>.jar
的jar包。此时的jar包只包含了项目代码,不包含第三方依赖的jar包。
第四步:将依赖jar包添加到可执行jar包中
为了将依赖jar包添加到打包后的可执行jar包中,我们需要以下步骤:
- 将依赖jar包打成一个lib目录,并放置在可执行jar包的同级目录下。
- 修改MANIFEST.MF文件,添加
Class-Path
属性,指定依赖jar包的相对路径。例如:Class-Path: lib/dep1.jar lib/dep2.jar
。
示例1
以下是一个项目的结构
myproject/
src/
main/
java/
com/
myproject/
Main.java
resources/
META-INF/
MANIFEST.MF
lib/
dep1.jar
dep2.jar
为了将依赖jar包打成一个lib目录,并放置在可执行jar包的同级目录下,可以使用以下Maven插件:
<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>
</configuration>
</execution>
</executions>
</plugin>
在执行mvn package
时,依赖jar包将会被自动打到lib目录中。
修改MANIFEST.MF文件,添加Class-Path
属性,指定依赖jar包的相对路径。例如:
Manifest-Version: 1.0
Class-Path: lib/dep1.jar lib/dep2.jar
Main-Class: com.myproject.Main
这样,我们就可以在项目目录下执行以下命令来执行生成的可执行jar包:
java -jar myproject-1.0-SNAPSHOT.jar
示例2
以下是另一个项目的结构:
myproject/
src/
com/
myproject/
Main.java
lib/
dep1.jar
dep2.jar
build.xml
假设该项目是一个Ant项目,我们想要将其打成一个可执行jar包。一种方法是在Ant脚本中,使用以下Ant任务将依赖jar包复制到指定目录:
<target name="copy-lib">
<mkdir dir="${build.dir}/lib"/>
<copy todir="${build.dir}/lib">
<fileset dir="${lib.dir}">
<include name="dep1.jar"/>
<include name="dep2.jar"/>
</fileset>
</copy>
</target>
然后,我们可以使用以下Ant任务,在MANIFEST.MF文件中指定Class-path
属性,并打包项目:
<target name="jar">
<mkdir dir="${build.dir}/jar"/>
<manifest file="${build.dir}/MANIFEST.MF">
<attribute name="Manifest-Version" value="1.0"/>
<attribute name="Main-Class" value="com.myproject.Main"/>
<attribute name="Class-Path" value="lib/dep1.jar lib/dep2.jar"/>
</manifest>
<copy todir="${build.dir}/jar">
<fileset dir="${build.dir}/classes"/>
</copy>
<jar destfile="${build.dir}/jar/myproject.jar" basedir="${build.dir}/jar" manifest="${build.dir}/MANIFEST.MF"/>
</target>
这样,我们就可以在项目目录下执行以下命令来执行生成的可执行jar包:
java -jar myproject.jar
到此为止,“IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题”已经得到了解决。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解) - Python技术站