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文件中记录着。
知识点:
- Project创建时默认会创建一个同名的Module模块
- Module默认沿用Project的SDK、语言等级等设置,当然也可自己指定
- 每个Module可自行管理依赖,可以是二方库、三方库......
- 本模块的依赖情况默认存储在项目的{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>