idea 打jar包、lib文件夹

idea目录文件

idea四层级结构

idea操作Java文件的基本单位:项目(Project)。对应四级结构
第1层级架构:项目(project)

在 IntelliJ IDEA 中Project是最顶级的结构单元,然后就是Module,一个Project可以有多个Module,模块之间彼此可以相互依赖

项目project包含:
    .idea文件夹(项目的配置文件)
     out文件夹(第2层级对应的所有字节码文件)
     模块文件夹(第2层级架构)

第2层级架构:模块(moudle)

在一个项目中,每个模块都可以使用特定的SDK或继承在项目级别定义的SDK。

模块moudle包含:
     src文件夹(存储第3层级架构内容)
     模块名.iml 文件(模块配置文件)
模块上右键-Open Module settiongs(可以新建模块,移除模块,导入模块)

第3层级架构:包(Package)
包的含义:多级文件夹
包的好处:1.对程序文件管理分类。2.有效避免重名的文件    

包中包含:
    java程序(第4层架构)

包的注意:如果程序在包中,必须在第4层架构进行包的声明
包的声明:
    1.包名就是公司域名倒序+功能 如:com.atguigu.idea
    2.格式:package 包名;
    3.命名规范:
         一个单词:单词全部小写(一般没有)
         多个单词:使用.进行间隔,一个单词就是一级文件夹

第4层级架构:.java文件(类文件)

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Helloworld"); 
   }
}

.iml文件

.iml:配置信息之意, infomation  of  module

iml文件是idea自己创建的模块文件,用于java应用开发,存储一些模块相关的信息。每个模块都有一个iml文件。 


.idea目录

.idea目录:存放项目的配置信息。包括数据源,类库,项目字符编码,历史记录,版本控制信息等


working dir目录

编辑配置


lib文件夹

lib文件夹

lib文件夹用于存放项目所依赖的第三方依赖包(jar文件),比如网路请求库,数据库连接等等。以便能够正确地引用和使用这些库。

lib文件夹通常位于Java项目的根目录下。在一个标准的Java项目中,lib文件夹下会包含多个jar文件,每个jar文件对应一个第三方库。

jar文件实际上是class文件的zip压缩存档

如下,创建LibTest的一个空工程,并手动新建lib文件夹,把mysql的包放进去

public class Demo {
    public static void main(String[] args) throws Exception {
        String className = "com.mysql.jdbc.Driver";
        //1. 注册驱动
        Class clazz = Class.forName(className);
        Driver driver = (Driver) clazz.newInstance();
        DriverManager.registerDriver(driver);
        //2. 获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/spring-boot-demo?serverTimezone=UTC&useSSL=false";
        String user = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, user, password);
        //3.获取数据库操作对象
        Statement stmt = conn.createStatement();
        //4.执行查询 SQL语句,返回结果集
        String username = "zhangsan";
        String sql = "select * from t_user where  username= '" + username + "'";
        ResultSet rs = stmt.executeQuery(sql);
        //5.通过索引来遍历读取结果集
        while (rs.next()) {
            int userId = rs.getInt(1);
            String name = rs.getString(2);
            String balance = rs.getString(3);
            System.out.println("userId:" + userId + " 姓名:" + name + " 余额:" + balance);
        }
        //6.资源的释放,讲道理要写到finally语句块中
        rs.close();
        stmt.close();
        conn.close();
    }
}

此时还没有使用idea工具把mysql-connector-java-5.1.47.jar添加到项目的classpath中,则会报错


引用lib文件夹中的库

当我们在Java代码中需要使用lib文件夹中的库时,首先需要将这些库添加到项目的classpath中。classpath是Java程序在运行时搜索类和资源文件的路径。

方式一: 给模块添加lib文件夹

点击jars or directiories

选择lib文件夹,点击ok,点击apply应用即可

方式二:添加项目级别的lib

在lib文件夹上右键-Add as Library…构建项目所需的jar包

Level级别有三个,选择默认的点击ok

  • Module Library:模块级别,只能本模块使用,别的模块看都看不见
  • Project Library(默认选中):项目级别,该项目下所有的模块均能看见和选中使用
  • Global Library:全局级别,任何项目均可看见和使用

再次运行Demo类,运行成功如下:


spring-boot-maven-plugin

打包插件用的是spring-boot-maven-plugin,这个插件会把项目中的代码和相关依赖一起打包成一个jar包,我们只需哪到这个jar包发布到服务器上即可,很方便

可以通过压缩工具查看jar包的文件目录,找到BOOT-INF下lib目录,可以看到里面有很多依赖包,然后其他的文件就是一些class文件和配置文件


Native Library Locations

Java是一种高级语言,其运行在Java虚拟机(JVM)上。而其他语言编写的库文件需要运行在操作系统上。为了能够在Java程序中加载这些库文件,需要通过Java Native Interface (JNI)来实现Java和其他语言的交互。

JNI是Java提供的一种机制,用于在Java程序中调用C、C++等其他语言编写的库文件。在Java中,通过System.loadLibrary()方法来加载库文件

当我们调用System.loadLibrary()方法时,Java会搜索java.library.path系统属性所指定的路径来查找库文件。如果找不到对应的库文件,就会抛出java.lang.UnsatisfiedLinkError异常。

在IDEA中,可以通过设置VM options来配置<code>-Djava.library.path</code>。以下是具体的操作步

System.out.println(System.getProperty("java.library.path"));

将.dll文件路径如图配置在VM option中即可.

路径结构类似于-Djava.library.path=F:/pro/znny_syx_standard/lib   

其中-Djava.library.path=为固定写法


Project Structure

参考:玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定-idea project structure (51cto.com)

Project Structure顾名思义,是针对Project维度的结构视窗.

顶部菜单File -> Project Structure..打开一个Project的结构展示窗口

可以看到它左边的“菜单栏”,共分为三个part:

  • Project Settings:项目设置(最重要),本文详解
  • Platform Settings:平台设置,也叫全局设置。用于管理SDK们(如JDK、Kotlin的SDK等)、全局库。

一般来讲,全局的JDK都会配置在此处,比如我因为经常要做多版本尝试,就管理了多个JDK版本


Project页

此视窗可以看到Project本身的基础信息。如:名称、SDK版本、语言等级等等,比较简单。

1.为何是SDK版本而不是JDK版本?

答:因为IntelliJ IDEA是JVM平台IDEA,不仅仅支持Java还有其它语言如Kotlin,所以写成SDK更抽象

2.为何指定了SDK还要指定语言等级?

答:因为SDK版本并不直接决定语言等级。如你用的JDK 11,但依旧可以把语言等级调为8来进行编译/运行。这是集成开发环境的优势所在,轻松对多环境进行定制化支持

3.SDK和语言等级Project都可指定,作为全局默认

这些配置Module默认集成,但可自行修改自己的。比如module 1使用Java 5编译,module 2使用Java 11编译,这是允许的


Module页

Module作为实际存在形式,所有的源代码、配置、依赖等都在这里,

每个模块都能独立管理着自己的依赖,这种关系在模块自己的.iml文件中记录着。

知识点:

  1. Project创建时默认会创建一个同名的Module模块
  2. Module默认沿用Project的SDK、语言等级等设置,当然也可自己指定
  3. 每个Module可自行管理依赖,可以是二方库、三方库......
  4. 本模块的依赖情况默认存储在项目的{moduleName}.iml文件里

idea模块(module) 是如何实现引用的,若A模块需要使用B模块里的东西可以直接在 A模块组织文件 A.iml 中添加一句

<orderEntry type="module" module-name="B模块名字" />

模块如何依赖其它Module

添加Dependency依赖时,请选择Module Dependency...选项:

点击ok,搞定了。对应的,此依赖关系也会体现在hello-service.iml这个配置文件上:


Libraries页

当某Library是所有/大部分模块都需要的依赖时,就可以上升为Project级别的依赖,抽取到Libraries标签页来统一管理。

选择作用的模块:

当然喽,你也可以一个都不选(点击cancle),那么该jar只是被创建了,而不作用于任何module模块。


Artifacts页

IDEA如何打Jar包?如何打War包? 来,上菜~

执行完此命令后,在Output Directory里就能看到hello.jar这个打包好的文件啦。


.classpath文件

在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用?

如果把该文件删除,则eclipse不能讲该工程识别为一个正常的java工程,仅仅当做普通的文件夹而导致不能正常运行。

idea中打jar包

创建Artifact

jar (Java Archive File),翻译过来就是java的档案文件。在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的,包含了JAR包的描述信息、主类的全类名等信息。

File -->Project Structure -->Artifacts --> Jar --> From module with dependencies.如下图

打开后,填写完成 点击ok

Module下拉框中选中需要打包的Module,

Main Class 框中选择主类。

Directory for META-INF/MENIFECT.MF   这里是输入一个路径,用于保存MENIFECT.MF文件,使用默认的路径即可

Include tests 如果选中,打包时将会把测试用例(Tests)类也打包进去。通常不用选中。


JAR files from libraries

JAR files from libraries有两个选项:

第一个是打完包就是一个 jar 包;
第二个打完包,是一个 jar 包+外带你项目所用的 jar 包

extract to the target JAR

表示将第三方JAR包内容都解压并统一打包到最后生成的JAR包。如下图

如果你只是希望打包Module本身,可以选择“extract to the target JAR”;

-------------------------------

copy to the output directory and link via menifest   

表示将第三方JAR包内容拷贝到输出目录,并在manifest中添加对应的属性(生成的MANIFEST.MF会包含Class-Path属性)

如果希望打包Module的同时,也将第三方的JAR一起打包,可以选择“copy to the output directory and link via menifest”。


配置Artifact

Name 输入框中可以修改Artifact的名称(不是生成的jar文件的名称)。

Output directtory:jar包的输出目录idea会有默认,可自己在Output directtory去改

Output Layout

Output Layout 中,你可以添加或删除需要打包的内容。

只希望打包Module本身,我们并不需要那么多的jar,在Output Layout中把多余的“减掉”

再重新build,打包后就只包含这个Module的class,不会包含第三方JAR


修改生成的jar文件的名称

如果希望修改生成的jar文件的名称,需要右键点击Output Layout框中的根节点,选择rename,如下图:

打包后结果


Build Artifacts

配置工作完成后,就可以正式构建jar包了

Build --> Build Artifacts,选择下面的Build,就完成jar包构建输出了。


实际使用

java -jar命令

java -jar 命令用于运行可执行的JAR文件。它会自动查找JAR文件中的清单文件(MANIFEST.MF),并根据清单文件中的Main-Class属性指定的主类来启动应用程序。

以下是一些常用的java -jar命令的参数,让我们逐一了解它们的功能和用法。

-Xmx:指定Java堆的最大内存大小。例如,-Xmx512m表示将最大堆内存设置为512MB。通过调整堆内存大小,可以优化应用程序的性能和内存使用情况。
-Xms:指定Java堆的初始内存大小。例如,-Xms256m表示将初始堆内存设置为256MB。这个参数可以帮助您在启动应用程序时控制初始内存分配的大小。
-Xss:指定线程栈的大小。例如,-Xss1m表示将线程栈大小设置为1MB。线程栈用于存储线程的局部变量和方法调用信息。通过调整线程栈的大小,可以控制应用程序的并发性能和内存使用情况。
-XX:MetaspaceSize=256m参数,您可以指定元空间的初始大小为256MB。这意味着在应用程序启动时,虚拟机会预分配256MB的内存用于存储类的元数据。
-XX:MaxMetaspaceSize=:指定元空间的最大大小。元空间用于存储类的元数据信息。例如,-XX:MaxMetaspaceSize=256m表示将元空间的最大大小设置为256MB。适当设置元空间的大小可以避免类加载和元数据溢出的问题。
-D=:设置系统属性。例如,-Djava.library.path=/path/to/libs设置java.library.path系统属性为/path/to/libs。您可以使用这个参数来配置应用程序的一些属性,例如文件路径、日志级别等。
-verbose:class:打印类加载信息。使用这个参数可以了解应用程序在运行过程中加载的类的详细信息,包括类的名称、来源等。
-verbose:gc:打印垃圾回收信息。通过使用这个参数,您可以了解应用程序的垃圾回收情况,包括垃圾回收器的使用情况、回收的对象数量等。
-Dfile.encoding=:设置默认的文件编码。例如,-Dfile.encoding=UTF-8表示使用UTF-8编码来读取和写入文件。正确设置文件编码可以确保应用程序能够正确处理不同字符集的文本数据。

以上是一些常用的java -jar命令的参数,通过灵活运用这些参数,您可以对应用程序的性能、内存使用和系统属性进行优化和配置。


可执行的JAR

可以执行的 JAR 与 普通的 JAR 最直接的区别就是能否通过 java -jar 来执行。

如果一个 JAR 文件被当作可执行文件,则其中的 MANIFEST 文件需要指出该程序的主类文件

java -jar xxx.jar

这种模式比较简单,适用于所有的class/资源都打包到一个jar文件中的情况.

-------------------------------------

如把上面的LibTest模块打包成一个可执行jar包:

使用压缩软件打开LibTest.jar包,可以看到MANIFEST 文件如下:


lib目录下(第三方jar)

 将其余的第三方jar放入lib目录下,LibTest.jar只是源码包

直接运行是会报错的

怎么办呢?改变manifest.mf,如下添加lib/,再重新构建

更好的办法:借助编辑,

因为manifest 文件中的每一行都是 key-value 对应的:属性名开头,接着是 ":" ,然后是属性值,每行最多72个字符,如果需要增加,可以在下一行续行,续行以空格开头,以空格开头的行都会被视为前一行的续行。

可以使用压缩软件打开LibTest.jar,看到文件中Class-Path的改动确实生效了


META-INF目录

jar文件中有一个特定的目录来存放标签信息:META-INF目录,其中一个名叫manifest.mf的文件,它包含了jar文件的内容描述,在应用程序运行时向JVM提供应用程序的信息

  • MANIFEST.MF:这个 manifest 文件定义了与扩展和包相关的数据。

 从 MANIFEST 文件中提供的信息大概可以了解到其基本作用

  • JAR 包基本信息描述
  • Main-Class 指定程序的入口,这样可以直接用java -jar xxx.jar来运行程序
  • Class-Path 指定jar包的依赖关系,class loader会依据这个路径来搜索class


在命令行中使用classpath参数

如果你使用命令行编译和运行Java程序,可以使用-cp或-classpath参数来指定classpath

javac -cp .:lib/* com/example/Main.java
java -cp .:lib/* com.example.Main

上述命令中的.表示当前目录,lib/*表示lib文件夹下的所有jar文件。


jar包冲突

有时候引入的jar包中的包名类名与其他jar包中的包名类名相同,导致程序在编译或运行的时候无法正确引用想要的类

Intellij IDEA里怎样配置maven在编译时加入lib目录下的jar包

<build>

        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                    <compilerArguments>
                        <extdirs>project-demo\lib</extdirs>
                    </compilerArguments>
                </configuration>
            </plugin>
         </plugins>       

</build>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/408446.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 网页标题:手机批发业务-商品备选区<

PyTorch概述(五)---LINEAR

torch.nn.Linear torch.nn.Linear(in_features,out_features,biasTrue,deviceNone,dtypeNone) 对输入的数据应用一个线性变换&#xff1a; 该模块支持TensorFLoat32类型的数据&#xff1b;在某些ROCm设备上&#xff0c;使用float16类型的数据输入时&#xff0c;该模块在反向传…

3.openEuler物理存储及逻辑卷管理(一):磁盘存储挂载与使用

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议下载麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 磁盘大类: HDD, (Hard Disk Drive的缩写) : 由一个或者多个铝制或者玻璃制成的磁性碟 片,磁头,…

消息中间件篇之RabbitMQ-高可用机制

一、怎么保证高可用性 在生产环境下&#xff0c;使用集群来保证高可用性&#xff0c;一般我们采用普通集群、镜像集群、仲裁队列。 二、普通集群 普通集群&#xff0c;或者叫标准集群&#xff08;classic cluster&#xff09;&#xff0c;具备下列特征&#xff1a; 1. 会在集…

LabVIEW串口通信的激光器模块智能控制

LabVIEW串口通信的激光器模块智能控制 介绍了通过于LabVIEW的VISA串口通信技术在激光器模块控制中的应用。通过研究VISA串口通信的方法和流程&#xff0c;实现了对激光器模块的有效控制&#xff0c;解决了数据发送格式的匹配问题&#xff0c;为激光器模块的智能控制提供了一种…

科学高效备考2024年AMC10:2000-2023年1250道AMC10真题练一练

我整理了2000-2023年的全部AMC10的AB卷真题共1250题&#xff0c;并且独家制作了多种在线练习&#xff0c;利用碎片化时间&#xff0c;一年足以通过自学在2024年AMC10竞赛中取得好成绩。 我们今天继续来随机看五道题目和解析。 2000-2023年AMC10真题练一练&#xff1a;2013年第…

一台台式电脑的耗电量有多少瓦?你知道吗?

核实后将予以处理。 感谢您为社区和谐做出的贡献。 一般来说&#xff0c;大多数台式电脑的功率在250W左右&#xff0c;也就是每4小时耗一度电。 一般有每小时100W左右的低功耗计算机&#xff0c;也有每小时1000W左右的高功耗计算机。 对于笔记本电脑来说&#xff0c;每小时约为…

990-03产品经理与程序员:什么是 IT 与业务协调以及为什么它很重要?

What is IT-business alignment and why is it important? 什么是IT-业务一致性&#xff1f;为什么它很重要&#xff1f; It’s more important than ever that IT and the business operate from the same playbook(剧本). So why do so many organizations struggle to ach…

3分钟彻底搞懂什么是 token

几年前在一次工作中&#xff0c;第一次接触到自然语言处理模型 BERT。 当时在评估这个模型的性能时&#xff0c;领导说这个模型的性能需要达到了 200 token 每秒&#xff0c;虽然知道这是一个性能指标&#xff0c;但是对 token 这个概念却不是很清晰。 因为当时接触视觉模型多…

快速启动-后台管理系统

目录 Gitee人人开源 后端快速启动 1.clone仓库到本地 2.初始化数据库 3.更改数据库连接 4.启动项目验证 前端快速启动 1.克隆仓库 2.vsCode打开 3.控制台npm install 4.验证测试 时代已然不同&#xff0c;后台管理也可以使用脚手架方式快速启动。 Gitee人人开源 地…

使用 ES|QL 优化可观察性:简化 Kubernetes 和 OTel 的 SRE 操作和问题解决

作者&#xff1a;Bahubali Shetti 作为一名运营工程师&#xff08;SRE、IT 运营、DevOps&#xff09;&#xff0c;管理技术和数据蔓延是一项持续的挑战。 简单地管理大量高维和高基数数据是令人难以承受的。 作为单一平台&#xff0c;Elastic 帮助 SRE 将无限的遥测数据&#…

谷歌连发 Gemini1.5、Gemma两种大模型,Groq让模型输出速度快18倍

本周&#xff0c;我们观察到以下AI领域的新动向和新趋势&#xff1a; 1.谷歌连发Gemini1.5和Gemma两种大模型&#xff0c; 其中Gemini1.5采用MoE架构&#xff0c;并拥有100万token上下文长度&#xff0c;相比Gemini 1.0性能大幅提升。Gemma是谷歌新推出的开源模型&#xff0c;…

项目实战:Qt监测操作系统物理网卡通断v1.1.0(支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136276999 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

32单片机基础:对射式红外传感器计次

接线如下图&#xff1a; 在HardWare建立两个文件&#xff1a;如图 COuntSensor.c 如何配置外部中断,根据下面图&#xff0c;我们需要把外部中断从GPIO到NVIC这一路出现的外设模块都配置好。把这条信号打通就OK了。 1.配置RCC:把我们这里涉及的外设时钟都打开&#xff0c;不打…

[算法沉淀记录] 排序算法 —— 冒泡排序

排序算法 —— 冒泡排序 基本概念 冒泡排序是一种简单的排序算法。它重复地遍历要排序的列表&#xff0c;一次比较两个元素&#xff0c;并交换它们的位置&#xff0c;如果它们不是按照升序排列的。这步遍历是重复进行的&#xff0c;直到没有再需要交换&#xff0c;也就是说该…

【MATLAB】 LMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 LMD分解算法 LMD (Local Mean Decomposition) 分解算法是一种信号分解算法&#xff0c;它可以将一个信号分解成多个局部平滑的成分&#xff0c;并且可以将高频噪声和低频信号有效地分离出来。LMD 分解算…

消息中间件篇之RabbitMQ-消息不丢失

一、生产者确认机制 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后&#xff0c;会返回一个结果给发送者&#xff0c;表示消息是否处理成功。 当消息没有到交换机就失败了&#xff0c;就会返回publish-confirm。当消息没有到达MQ时&…

打开 Camera app 出图,前几帧图像偏暗、偏色该怎样去避免?

1、问题背景 使用的安卓平台&#xff0c;客户的应用是要尽可能快的获取到1帧图像效果正常的图片。 但当打开 camera 启动出流后&#xff0c;前3-5帧图像是偏暗、偏色的&#xff0c;如下图所示&#xff0c;是抓取出流的前25帧图像&#xff0c; 前3帧颜色是偏蓝的&#xff0c;…

[嵌入式系统-33]:RT-Thread -18- 新手指南:三种不同的版本、三阶段学习路径

目录 前言&#xff1a;学习路径&#xff1a;入门学习-》进阶段学习》应用开发 一、RT-Thread版本 1.1 标准版 1.2 Nano 1.3 Smart版本 1.4 初学者制定学习路线 1.5 RT-Thread在线文档中心目录结构 1.6 学习和使用RT-Thread的三种场景 二、入门学习阶段&#xff1a;内…

架构设计:微服务架构实践

引言 前段时间做项目的时候有客户问到过我&#xff0c;什么微服务&#xff1f;微服务是一种架构风格&#xff0c;其中软件系统被构建为一组小型服务&#xff0c;每个服务都运行在自己的进程中并使用轻量级通信机制&#xff08;如HTTP或消息队列&#xff09;进行通信。这些服务…