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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Llama中文大模型-模型+工具(外延能力)

除了持续增强大模型内在的知识储备、通用理解、逻辑推理和想象能力等&#xff0c;未来&#xff0c;我们也会不断丰富大模型的外延能力&#xff0c;例如知识库检索、计算工具、WolframAlpha、操作软件等。 我们首先集成了LangChain框架&#xff0c;可以更方便地基于Llama2开发文…

MySQL知识点总结(六)——InnoDB底层架构

MySQL知识点总结&#xff08;六&#xff09;——InnoDB底层架构 InnoDB底层架构总览InnoDB底层各组件分析Buffer PoolChange BufferLog BufferAdaptive Hash IndexSystem TablesapceUndo TablespacesRedo Log InnoDB底层架构总览 关于InnoDB底层架构&#xff0c;网上有一张非常…

JS基础之常用方法

JS基础之常用方法 目录 JS基础之常用方法字符串数字布尔数组 字符串 length: 返回字符串的长度 var sen " Hello World" console.log(sen) // Hello World console.log(sen.length) // 12trim():去除首尾空格 var sen " Hello World" console.log(se…

电脑常见问题及解决方法

如何速度定位电脑故障&#xff1f; 根据开机报警的声音&#xff0c;判断硬件的问题。AMI BIOS 1 短——内存刷新失败 2 短——内存ECC 校验错误 3 短——系统基本内存[检查失败 4 短——系统时钟出错 5 短——中央处理器错误 6 短——键盘控制器错误 7 短——系统实模式…

Linux之JAVA环境配置Tomcat离线安装与启动

一&#xff0c;安装jdk和Tomcat 1.1上传JDK跟Tomcat 1.2解压 解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz 解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 1.3.配置环境变量 vim /etc/profile 在最后加上&#xff1a; #java environment export JAVA_HOME/usr/local/ja…

异步框架Celery在Django中的运用

参考博客&#xff1a;https://www.cnblogs.com/pyedu/p/12461819.html 参考视频&#xff1a;01 celery的工作机制_哔哩哔哩_bilibili 定义&#xff1a;简单灵活、处理大量消息的分布式系统&#xff0c;专注于实时处理异步队列&#xff0c;支持任务调度 主要架构&#xff1a; …

Linux的信号

Linux的信号是一种用于进程之间通信的机制。它们用于向进程发送通知&#xff0c;告知进程发生了某种事件或请求进程执行某个操作。信号可以由内核、其他进程或进程自身发送。 信号的作用有以下几个方面&#xff1a; 通知进程某个事件的发生&#xff0c;如进程的终止、挂起、恢…

springboot/ssm来访管理系统Java访客预约来访登记系统web

springboot/ssm来访管理系统Java访客预约来访登记系统web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysq…

软件实例,物流货运配货单打印模板软件单据打印查询管理系统软件教程,可以同时打印标签或补打

软件实例&#xff0c;物流货运配货单打印模板软件单据打印查询管理系统软件教程&#xff0c;可以同时打印标签或补打 一、前言 以下软件教程以 佳易王物流单打印查询系统V17.1为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 这个版本在原来基…

Android 跨进程通信技术优劣分析

一、引言 在Android开发中&#xff0c;跨进程通信&#xff08;IPC&#xff09;是一项常见的任务&#xff0c;用于在不同的应用程序或组件之间交换数据。有多种IPC机制可供选择&#xff0c;每种机制都有其优势和劣势。以下是对几种常见IPC技术的分析。 二、跨进程通信 2.1、Bi…

【软件使用】postman使用教程

​ &#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;软件安装及使用 ⛳️ 功不唐捐&#xff0c;玉汝于成 ​ 目录 前言 正文 步骤1&#xff1a;安装Postman 步骤2&#xff1a;发送请求 步骤3&#xff1a;管理环境变量 步骤4&#xff1…

Leetcode 26-30题

删除有序数组中的重复项 给定一个有序数组&#xff0c;要求原地删除重复出现的元素&#xff0c;返回删除后的数组的长度。 这里的原地删除其实可以这样表示&#xff0c;用双指针从前往后扫一遍&#xff0c;遇到新的没出现过的元素就放到前面去&#xff0c;就可以实现删除后的数…

Linux线程同步(2)死锁与互斥锁

死锁&#xff08;Deadlock&#xff09;是指两个或两个以上的进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了…

定频空调与变频空调的区别

变频空调是通过变频器来改变压缩机运转电压以及频率&#xff0c;从而改变压缩机转速的新型空调&#xff0c;那么他和定频空调有哪些区别呢&#xff1f; 一、控制启停的方式不同 定频空调控制方式为&#xff1a;当T环 < T设 - 2℃&#xff0c;压缩机停机。 当 T环 > T…

Java实现就医保险管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

【前端素材】推荐优质后台管理系统Qovex平台模板(附源码)

一、需求分析 1、定义 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作&#xff0c;用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心&#xff0c;管理员可以通过后台系统进行各种管理…

构造函数,原型,实例,类的关系整理

视频来源js原型链、构造函数和类_哔哩哔哩_bilibili 如视频所说&#xff0c;构造函数的prototype指向原型&#xff0c;实例化的对象的__proto__指向原型&#xff0c;原型通过constructor指向构造函数&#xff0c;正如class里面的constructor方法就相当于Person构造函数一样&am…

基于PID-bang-bang控制算法的卫星姿态控制matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于PID-bang-bang控制算法的卫星姿态控制。仿真输出控制器的控制收敛曲线&#xff0c;卫星姿态调整过程的动画。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB…

连接SFTP服务器报错host key for has changed and you have requested strict checking

背景&#xff1a;今天连接SFTP的时候&#xff0c;报错如下&#xff0c;记录一下 报错如下 WARNING: REMOTE HOST IDENTIFICATION HSS CHANGED!cccececccccceeteeacaaeapepeppeeecpeepeeecepeeeaeeeeeceeeeeeIT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone co…

LeetCode每日一题——2583. Kth Largest Sum in a Binary Tree

文章目录 一、题目二、题解 一、题目 You are given the root of a binary tree and a positive integer k. The level sum in the tree is the sum of the values of the nodes that are on the same level. Return the kth largest level sum in the tree (not necessaril…