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类,运行成功如下:
在命令行中使用classpath参数
如果你使用命令行编译和运行Java程序,可以使用-cp或-classpath参数来指定classpath
javac -cp .:lib/* com/example/Main.java
java -cp .:lib/* com.example.Main
上述命令中的.表示当前目录,lib/*表示lib文件夹下的所有jar文件。
spring-boot-maven-plugin
打包插件用的是spring-boot-maven-plugin,这个插件会把项目中的代码和相关依赖一起打包成一个jar包,我们只需哪到这个jar包发布到服务器上即可,很方便
可以通过压缩工具查看jar包的文件目录,找到BOOT-INF下lib目录,可以看到里面有很多依赖包,然后其他的文件就是一些class文件和配置文件
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
manifest 文件中的每一行都是 key-value 对应的:属性名开头,接着是 ":" ,然后是属性值,每行最多72个字符,如果需要增加,可以在下一行续行,续行以空格开头,以空格开头的行都会被视为前一行的续行。
可以执行的 JAR
可以执行的 JAR 与 普通的 JAR 最直接的区别就是能否通过 java -jar 来执行。
如果一个 JAR 文件被当作可执行文件,则其中的 MANIFEST 文件需要指出该程序的主类文件
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 包;第二个打完包,是一个 jar 包+外带你项目所用的 jar 包
extract to the target JAR
表示将第三方JAR包内容都解压并统一打包到最后生成的JAR包。如下图
copy to the output directory and link via menifest
表示将第三方JAR包内容拷贝到输出目录。如下图
如果你只是希望打包Module本身,可以选择“extract to the target JAR”;
如果希望打包Module的同时,也将第三方的JAR一起打包,可以选择“copy to the output directory and link via menifest”。
--------------------
配置Artifact
Name 和 Output directtory
Name 输入框中可以修改Artifact的名称(不是生成的jar文件的名称)。
Artifacts “tab页”就会显示如下:jar包的输出目录idea会有默认,可自己去改
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 xxx.jar
这种模式比较简单,适用于所有的class/资源都打包到一个jar文件中的情况,
一个项目中可能包含大量的第三方库,这时,如果将所有的库都打包到同一个jar文件中,显然是不合适的,所以通常我们会使用下面的方式。
java -cp xxx xxx.xxx
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>