1、第三方库
1.1 背景
- JDK已提供的功能,可以通过相应的 API 直接使用,不用自己重新实现。
- JDK没有提供的功能,在富有开源精神的 IT行业,大部分通用功能也都能在开源社区找到。
1.2 概念
1.3 第三方库和API的关系
以上为Arrays工具类提供的静态方法 asList ,包括方法名,方法参数(可变的多个泛型对象),返回类型(实现List接口的对象),整个方法定义构成了Arrays工具类提供的API:将某类型的多个对象转换为填充了这些对象的List。
第三方库和API的关系,类似于餐馆和点餐,对于餐馆(第三方库,被调用方)提供的点餐服务(API)来说,消费者(调用方)不用关心餐馆内部如何实现。
1.4 如何使用第三方库
import org.fusesource.jansi.AnsiConsole;
import static org.fusesource.jansi.Ansi.Color.*;
import static org.fusesource.jansi.Ansi.ansi;
public class Main {
public static void main(String[] args) {
AnsiConsole.systemInstall();
int lineNumber = 0;
System.out.print( ansi().fg(MAGENTA).a(++lineNumber));
System.out.println( ansi().fg(CYAN).a("面试官:").fg(RED).a("你都会什么编程
语言?") );
System.out.print( ansi().fg(MAGENTA).a(++lineNumber));
System.out.println( ansi().fg(BLUE).a("我: ").fg(GREEN).a("精通C、
C++、Java、HTML、JavaScript等语言,的单词拼写") );
System.out.print( ansi().fg(MAGENTA).a(++lineNumber));
System.out.println( ansi().fg(CYAN).a("面试官:").fg(RED).a("就这?会什么系
统嘛?") );
System.out.print( ansi().fg(MAGENTA).a(++lineNumber));
System.out.println( ansi().fg(BLUE).a("我: ").fg(GREEN).a("精通
Windows、Mac、Linux系统,的关机") );
AnsiConsole.systemUninstall();
}
}
javac - cp "E:/test/lib/jansi-2.3.3.jar" - encoding UTF-8 Main.java
java - cp ".;E:/test/lib/jansi-2.3.3.jar" Main
2、Java程序标准流程
2.1 流程
- 开发环境中,一般开发完java代码后,编译并运行即可。
- 生产环境中,不是在开发人员电脑中运行程序,而是在生产的服务器主机中运行
2.2 编译:javac
2.3 运行:java
执行java程序会:
1. 开启java虚拟机2. 加载class字节码到内存3. java虚拟机执行字节码指令(翻译为机器码)4. cpu执行机器码
2.4 打包:jar
- 如果是web项目(后边学习,这里简单了解即可),会打包为war文件。
- 一般的项目,打包为jar文件,对于jar文件来说,一般是以下作用:
jar文件中需要包含 META-INF/MANIFEST.MF 文件,作为描述信息,格式为键: 值,我们主要关注两个:Main-Class: 入口类的全限定名(包名+类名)Class-Path: 指定jar文件运行时依赖包的路径。多个依赖包时:(1)Windows中以 ; 间隔(2)Mac/Linux中以 : 间隔
jar命令使用格式为:
- 作为依赖包提供给其他项目使用:
jar cvf 生成的文件名 包含的文件或目录 [ 多个之间 Windows 以 ; 间隔, Mac 或 Linux 以 : 间隔 ]
- 作为应用程序:
jar cvfe 生成的文件名 入口类的全限定名 包含的文件或目录
2.5 示例
jar cvfe main.jar Main Main.class
以上命令执行成功会在当前路径下,生成一个main.jar的文件,用解压工具(如WinRAR)打开,再双击使用编辑器打开其中的 META-INF/MANIFEST.MF 文件,添加 Class-Path :
以下为文件内容:
Manifest-Version: 1.0
Created-By: 1.8.0_281 (Oracle Corporation)Main-Class: Main
Manifest-Version: 1.0Created-By: 1.8.0_281 (Oracle Corporation)Main-Class: MainClass-Path: lib/jansi-2.3.3.jar
修改完成后,即可以直接运行:
java -jar main.jar
3、构建工具
3.1 背景(了解)
- 依赖包需要手动下载:如果依赖包还有自身的依赖,需要递归下载。
- 编译(javac)、打包(jar)、运行(java)需要指定依赖包路径参数,即便使用IDEA等工具,还需要配置后才能操作,比较麻烦。
- 了解:打包后的结构作为生产环境运行结构,需要和开发环境运行结构一致:除了依赖包,可能还需要在运行时加载配置文件、资源文件等。此时手动操作一般是复制到编译路径,将整个编译路径中的文件打包;或使用IDEA等工具,进行配置后再操作。
- 上传到代码库中的项目代码、依赖包、配置文件和资源文件,其他开发人员下载以后,还需要重新配置,使用非常不方便。
3.2 常见构建工具(了解)
- Ant:比较老的一款构建工具,构建时需要自行指定编译路径,资源路径等,依赖包还是需要自行下载。目前主流的项目都不再使用。
- Maven:采取“约定优于配置”的思想,约定好编译路径,资源路径等(也可以配置修改),依赖包可以从网络自行下载,Maven主要基于XML文件进行配置。目前Java服务端项目大多使用Maven来构建。
- Gradle:和Maven功能非常类似,只是采取基于Groovy脚本语言的DSL语法进行配置。安卓开发几乎都是基于Gradle。
3.3 关于Maven
3.4 Maven安装
- 下载解压
要在cmd中全局使用Maven命令,需要配置环境变量。
- Maven环境变量配置
再在 Path 环境变量中,添加Maven工具bin目录为全局命令路径
%M2_HOME%\bin
- 检测安装配置是否成功
mvn -version
3.5 Maven使用及作用
- 全局依赖管理
在Maven中可以配置以上仓库:Maven根目录下的 conf 目录中, settings.xml 文件即为Maven的全局配置文件,以上的Maven仓库都可以在其中进行配置。我们主要配置本地仓库,远程仓库暂不配置(此时会使用Maven默认的官方远程仓库)。
在XML中 <!-- 为注释开始, --> 为注释结束,以上 <localRepository> 标签即为本地仓库的配置,将该标签所有内容全部复制到注释外,并指定为本地某个目录。以下为修改后的内容:
Maven初次使用从网络中下载大量的依赖包,可以使用我们准备好的本地仓库内容,解压到以上路径即可。注意解压后,在以上路径下的内容为:
- 创建Maven项目
点击 Next 后,需要输入以下信息:
GroupId :组织 id 、组织名,一般使用公司的域名,如 com.alibaba 。同时按规范,自己写的 java都在这样的包下。个人使用随便取自己英文名或拼音都行。ArtifactId :产品 id 、产品名,项目即产品,所以一般使用本项目名,多个英文之间 - 间隔。Version :产品的版本号,本项目可能有多个版本提供给别人使用。
选择项目路径
创建完成后,如果右下角出现以下弹窗,需要开启自动导入功能:
至此项目新建完成。
- Maven项目结构的默认约定
了解:IDEA创建时,会省略一个 src/test/resources 的目录,代表测试资源目录,用于存放单元测试用的配置文件,可以自行创建。
- 在 src/main/resources 目录下,创建一个配置文件(任意文件都行,以下为创建的 test.xml文件)
- 在 src/main/java 目录下,随便创建一个类,编写 main 方法运行后,会生成编译结构:
- Maven项目配置
1.指定JDK版本:默认情况下,maven 会使用 1.5 版本进行代码检查,需要修改为 1.8。在属性标签<properties> 中配置即可。
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
2.引入依赖包:当前项目需要引入第三方库依赖包时使用。在 <dependencies> 标签中配置<dependency> 标签,每个 <dependency> 标签为一个引入的依赖包,使用组织id,产品id,版本号标识要引入的依赖包。以下引入 jansi 和 mysql 两个依赖包:
<dependencies>
<dependency>
<groupId>org.fusesource.jansi</groupId>
<artifactId>jansi</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Fo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.fusesource.jansi</groupId>
<artifactId>jansi</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
</project>
- Maven的生命周期命令
对于以上命令,大家可以双击运行并观察执行结果。
4、软件运行时的依赖资源
4.1 运行时环境
PS:JDK是Java程序开发需要的环境,JDK包含了JRE。
4.2 程序代码
4.3 外部资源
- 数据库资源:程序运行时,需要连接某个数据库服务器,并调用服务器提供的服务资源。
数据库包括:1. 关系型数据库(RDBMS数据库)如MySQL,Oracle,SQL Server,DB2等。2. 非关系型数据库(NoSQL数据库)如Redis,MongoDB,HBase等。以上数据库都可以提供服务,让其他程序调用。
- 文件资源:程序代码中可能会使用外部的本地文件/文件夹。如服务端在代码中读取某个本地文件内容并返回给客户端。
- 其他:还有很多类型外部资源,如程序中依赖其他系统提供的URL资源,依赖MQ消息中间件等等。
4.4 内部资源
- 配置文件:专门用于配置某些信息,以便于程序运行时加载使用的文件,常见的配置文件格式有xml,properties等。
有些信息虽然可以直接在程序代码中保存,但会存在灵活性,维护性等等问题。在不同的环境需要灵活调整的信息,在设计上,一般会考虑保存在配置文件中,程序从配置文件读取:
- 例如数据库URL,账号,密码等信息,不同开发人员可能需要连接本机数据库,或开发 环境数据库;有时候可能需要连接测试数据库调试问题;项目部署到生产环境时,又要调整为连接生产数据库。
- 例如引用外部本地文件资源的路径,不同开发人员在本机运行程序时,需要调整为本地某个路径;程序在开发环境,测试环境,生产环境运行时,又需要调整为当前环境主机的本地路径。
- 如果以上信息保存在程序中,那就得重新编译,步骤繁琐,且容易出错。
PS(了解):更进一步,配置信息也不一定必须保存在程序内的配置文件中,还可以保存在其他地方,如数据库,其他系统URL资源。
- 其他文件:除配置文件之外的其他文件,如图片,视频,文本文件,Web课程会学习的HTML,JS文件等。
4.5 日志
- Java中一般使用日志框架,可以输出到控制台,也可以输出到日志文件。此时不再使用 System.out.print 打印。
- 日志框架一般提供调试信息,普通信息,警告信息,错误信息等,便于不同模式下打印不同的信息。
- 还可以使用不同的日志文件,按多种维度来记录:如按日期,按业务,按分层(不同的Java包)等等。以便于更快速的查找到日志信息。
5、IDEA中的软件环境
5.1 javac指令的集成
5.2 java指令的集成
5.3 maven集成
6、附录
6.1 IDEA配置Maven本地仓库
下载Repository.zip,确保存放在本地某个路径中,之后别移动了。并解压压缩包,解压后是这样的: