IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解)

下面是“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 librariesMain 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技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 深入理解 PHP7 中全新的 zval 容器和引用计数机制

    深入理解 PHP7 中全新的 zval 容器和引用计数机制攻略 介绍 在 PHP7 中,引入了全新的 zval 容器和引用计数机制,这是为了提高 PHP 的性能和内存管理而进行的重要改进。本攻略将详细讲解这些新特性,并提供两个示例来说明其工作原理。 zval 容器 在 PHP7 之前,PHP 使用了一种称为 zval 的结构来存储变量的值和类型信息。然而,这…

    other 2023年8月8日
    00
  • Logback配置文件这么写,还说你不会整理日志?

    当我们开发的应用程序或者服务运行起来后,往往需要记录一些关键的操作日志,或者是出现了异常、错误信息等情况时需要将这些信息记录下来方便我们排查问题。因此,日志对于软件开发和运维是非常重要的。进行日志管理的方式有多种,而 Logback 是一款非常优秀、流行的日志框架。 在项目中使用 Logback 的时候,首先需要配置 Logback 的配置文件。下面是一个完…

    other 2023年6月25日
    00
  • Element使用el-table组件二次封装

    接下来我将为您详细讲解Element使用el-table组件二次封装的完整攻略。 什么是el-table组件 el-table 是一个使用 vue.js 2.0 和 element-ui 组件库构建的高效、灵活的表格组件,可以满足大部分的表格展示需求。使用 el-table 可以更加方便地展示表格数据,并提供排序、分页、搜索和自定义模板等增强功能。 为什么要…

    other 2023年6月25日
    00
  • Python批量修改文件名实例操作分享

    我将为您介绍一种Python批量修改文件名的方法,其中包括两个示例说明。 步骤一:导入必要的库 在使用Python进行文件操作时,要导入os库,该库提供了许多方法来处理文件和目录。 import os 步骤二:获取要修改的文件路径 使用os.listdir()方法列出要修改文件所在文件夹中的所有文件,并将其存储在一个列表中。在这个例子中,我们将以删除文件名中…

    other 2023年6月26日
    00
  • Android应用内调用第三方应用的方法

    Android应用内调用第三方应用的方法 要在Android应用内调用第三方应用,可以使用隐式意图(Implicit Intent)来实现。以下是详细步骤: 确定要调用的第三方应用的包名和启动Activity的类名。 创建一个隐式意图,并设置要调用的第三方应用的包名和启动Activity的类名。 java Intent intent = new Intent…

    other 2023年10月14日
    00
  • 详解在Linux下搭建Git服务器

    当初写这篇文章的时候,主要是介绍如何在Linux服务器上搭建Git服务器,方便团队协作开发和版本控制管理。下面是文章的完整攻略: 在Linux下搭建Git服务器 简介 Git是一款分布式版本控制软件,它旨在快速高效地处理从小型到超大型项目的所有活动。Git通常用于团队协作,以便每个人都能够跟踪项目的变化并在需要时进行更改。本文介绍如何在Linux服务器上搭建…

    other 2023年6月27日
    00
  • Lua教程(十): 全局变量和非全局的环境

    Lua教程(十): 全局变量和非全局的环境 在Lua中,变量可以分为全局变量和局部变量。全局变量是在程序的任何地方都可以访问的变量,而局部变量只能在其定义的作用域内访问。 全局变量 全局变量在Lua中使用全局环境来存储和访问。全局环境是一个特殊的表,可以通过_G全局变量来访问。可以使用全局变量来存储和访问全局状态和数据。 以下是一个示例,演示如何使用全局变量…

    other 2023年7月28日
    00
  • Go单元测试对数据库CRUD进行Mock测试

    以下是使用Go进行单元测试对数据库CRUD进行Mock测试的完整攻略: 步骤1:安装依赖库 首先,您需要安装以下依赖库: go get github.com/stretchr/testify/assert go get github.com/DATA-DOG/go-sqlmock 步骤2:编写测试代码 接下来,您可以编写测试代码来进行数据库CRUD的Mock…

    other 2023年10月17日
    00
合作推广
合作推广
分享本页
返回顶部