文章目录
一.JAVA 介绍
1.1 java 介绍
Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。
Java 可运行于多个平台,如 Windows, Mac OS,及其他多种 UNIX 版本的系统。
Java 原指的是印度尼西亚的爪哇岛,人口众多,盛产咖啡、橡胶等。Java 语言
最早是在 1991 年开始设计的,期初叫 Oak 项目,它初衷是跑在不同机顶盒设
备中的。1993 网景公司(Netscape)成立。Oak 项目组很快他们发现了浏览器和
动态网页技术这个巨大的市场,转向 WEB 方向。并首先发布了可以让网页动起来
的 Applet 技术(在浏览器中嵌入运行 Java 字节码的技术)。在 1995 年,一杯
爪哇岛咖啡成就了 Java 这个名字。
Sun 公司第一个 Java 公开版本 1.0 发布于 1996 年。口号是"一次编写,到处
运行"(Write once,Run anywhere),跨平台运行。
1999 年,SUN 公司发布了第二代 Java 平台(Java2)。
2009 年 4 月 20 日,Oracle 甲骨文公司宣布将以每股 9.50 美元,总计 74 亿
美金收购 SUN(计算机系统)公司。2010 年 1 月成功收购。
2010 年,Java 创始人之一的 James Gosling 离开了 Oracle,去了 Google。
2010年8月13日,Oracle在加利福尼亚地方法院起诉Google侵犯版权和专利权。Oracle声称
Google侵犯了Java 37个API和部分专利。地方法院的陪审团认为未侵犯专利,且API无版权。
2016年5月26日,地方法院二审陪审团认定未侵犯版权,对37个JAVA API的重新实现受到合理使
用的保护。
2017年Oracle上诉美国联邦巡回上诉法院,2018年3月27日,判决Oracle胜诉,Google应赔偿近
90亿美金。
2019年1月Google想让美国最高法院撤销联邦法院裁决。谷歌表示裁决是“对软件业的毁灭性一
击”。现任特朗普政府支持Oracle公司,但微软、Mozilla、红帽支持Google。目前案件已经受
理,并将审理。
此案如果Oracle胜诉,将在美国形成判例,将深远广泛影响软件业。例如POSIX接口,是商用系
统UNIX的兼容接口规范。
1.2 Java 组成
直接说 java 的组成是不合适的,在实际应用中,java 有不同的版本。有标准的
java 也有企业版的 java,还有适合于嵌入式设备运行的 java 环境集合。一般
来说,使用 java 语言编写的应用要在各种平台运行起来,需要以下部分:
- java 应用源代码
- 依赖库,标准库、第三方库
- JVM 虚拟机
不同的操作系统的 ABI(应用程序二进制接口)不一样,所以在不同的操作系统上
都有不同的 JVM 实现。这是 java 可以跨平台的根本原因。
1995 年,Java 发布 Applet 技术,Java 程序在后台编译成字节码,发送到浏
览器端,在浏览器中运行一个 Applet 程序,这段程序是运行在另外一个 JVM
进程中的。但是这种在客户端运行 Java 代码的技术,会有很大的安全问题。
1997 年 CGI 技术发展起来,动态网页技术开始向后端开发转移,在后端将动态
内容组织好,拼成 HTML 发回到浏览器端。
1.3 JVM/JRE/JDK 三者关系
1.3.1 JDK
JDK:Java Development Kit,其实 java 语言的开发工具包,
一般包含 JRE 和 JVM。
JDK 也就是常说的 J2SE,在 1999 年,正式发布了 Java 第二代平台,发布了三个版本:
J2SE:标准版,适用于桌面平台
J2EE:企业版,适用于企业级应用服务器开发
J2ME:微型版,适用于移动、无线、机顶盒等设备环境
2005 年,Java 的版本又更名为 JavaSE、JavaEE、JavaME。
Servlet、Jsp 都包含在 JavaEE 规范中。
JDK 和 JRE 和 JVM 三者的关系如下图:
JDK 包含了开发所需要的所有工具和相关的 API 和相关的库。
JDK 版本历史
JDK7、JDK8、JDK11 是 LTS(Long Term Suppot)长期支持版
Centos7 安装 OpenJDK
[root@node1 ~]# yum install java-1.8.0-openjdk.x86_64 -y
[root@node1 ~]# java -version
openjdk version "1.8.0_222-ea"
OpenJDK Runtime Environment (build 1.8.0_222-ea-b03)
OpenJDK 64-Bit Server VM (build 25.222-b03, mixed mode)
使用 Oracle 官网的 JDK 8 的 rpm 安装
# yum install jdk-8u191-linux-x64.rpm
# java
# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
Java 全局配置
# ll /usr/java
lrwxrwxrwx 1 root root 16 1月 13 01:22 default -> /usr/java/latest
drwxr-xr-x 8 root root 258 1月 13 01:22 jdk1.8.0_191-amd64
lrwxrwxrwx 1 root root 28 1月 13 01:22 latest -> /usr/java/jdk1.8.0_191-amd64
# vi /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
# . /etc/profile.d/jdk.sh
1.3.2 OpenJDK
OpenJDK 是 Sun 公司采用 GPL v2 协议发布的 JDK 开源版本,于 2009 年正
式发布。OpenJDK 官网
OpenJDK 7 是基于 JDK7 的 beta 版开发,但为了也将 Java SE 6 开源,从
OpenJDK7 的 b20 构建反向分支开发,从中剥离了不符合 Java SE 6 规范的
代码,发布 OpenJDK 6。所以 OpenJDK6 和 JDK6 没什么关系。OpenJDK 使用
GPL v2 可以用于商业用途。
1.3.3 JRE
JRE:Java Runtime Environment,指 Java 运行时环境,
包含 JVM + Java 核心类库。
JRE 包含了:部署工具、用户接口工具、集成类库和用户接口类库、其它的基础库和
java 虚拟机等。
1.3.4 JVM
JVM:Java Virtual Machine,指将 java 源码翻译为机器码的引擎。下面的图
展示了整个 JVM 的内部架构。
图中被类加载子系统加载的
.class
类文件是由 javac 编译器编译而成。类加载
子系统除了加载类文件外还进行连接和初始化,之后类文件被加载进 java 运行数据
内存区,之后被执行引擎执行。执行引擎实质是一个即时编译器(JIT Compiler:
just-in-time compiler),在这里类文件被转换成中间语言,经过代码优化器后
生成可以执行的目标语言(机器语言),之后被 CPU 执行。在这期间,涉及内存垃圾
回收和多种库的相互配合。
1.4 Java 动态网页技术
Java 的动态网页技术本(servlet)质上就是一段 java 程序
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
private String message;
public void init() throws ServletException
{
message = "Hello World";
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy()
{
}
}
在 Servlet 中最大的问题是,HTML 输出和 Java 代码混在一起,
如果网页布局要调整,就是个噩梦。除了安全性,这是其最大的缺点。
jsp(Java Server Pages)
提供一个 HTML,把它变成一个模板,也就是在网页中预留以后填充的空,
以后就变成了填空了。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>jsp例子</title>
</head>
<body>
<!-- 后面的内容是服务器端动态生成字符串,最后拼接在一起 -->
<% out.println("你的 IP 地址 " + request.getRemoteAddr()); %>
</body>
</html>
JSP 是基于 Servlet 实现,JSP 将表现和逻辑分离,这样页面开发人员
更好的注重页面表现力更好服务客户。JSP 先转换为 Servlet 的源代码
.java 文件(Tomcat 中使用 Jasper 转换),然后再编译成.class 文
件,最后就可以在 JVM 中运行了。
二.Tomcat 介绍
2.1 简介
Tomcat 是由一系列可配置的组件组成的容器。各个组件各司其职,各个组件之间松
耦合。由于各个组件之间的松耦合使得整体架构具有很强的可伸缩性和可扩展性。
Tomcat 起始于 SUN 的一个 Servlet 的参考实现项目 Java Web Server,作者是
James Duncan Davidson,后将项目贡献给了 ASF。和 ASF 现有的项目合并,并开
源成为顶级项目,官网。
Tomcat 仅仅实现了 Java EE 规范中与 Servlet、JSP 相关的类库,是 JavaEE
不完整实现。著名图书出版商 O’Reilly 约稿该项目成员,出一本关于 Tomcat 的
书籍,书名为:Tomca The Definitive Guide
,中文也叫 Tomcat 权威指南
。
Davidson 希望使用一个公猫作为封面,但是公猫已经被另一本书使用,书出版后
封面是一只雪豹。
1999 年发布初始版本是 Tomcat 3.0,实现了 Servlet 2.2 和 JSP1.1 规范。
Tomcat 4.x 发布时,内建了 Catalina(Servlet 容器)和 Jasper(JSP engine)等。
商用的有 IBM WebSphere、Oracle WebLogic(原属于 BEA 公司)、Oracle Oc4j、
Glassfish、JBoss 等。开源实现有 Tomcat、Jetty、Resin。
2.2 安装和目录结构
2.2.1 使用 yum 源安装
可以使用 CentOS7 yum 源自带的安装,yum 源中是 Tomcat 7.0 版本。
[root@node1 ~]# yum install tomcat tomcat-admin-webapps tomcat-webapps
[root@node1 ~]# rpm -ql tomcat
/etc/logrotate.d/tomcat
/etc/sysconfig/tomcat
/etc/tomcat
...
/usr/bin/tomcat
...
[root@node1 ~]# systemctl start tomcat
[root@node1 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
...
LISTEN 0 1 [::ffff:127.0.0.1]:8005 [::]:*
LISTEN 0 100 [::]:8009 [::]:*
LISTEN 0 100 [::]:8080 [::]:*
...
2.2.2 使用官方二进制包安装
[root@node1 data]# wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.42/bin/
[root@node1 data]# ll apache-tomcat-8.5.42.tar.gz
-rw-r--r-- 1 root root 9711748 Jun 20 2019 apache-tomcat-8.5.42.tar.gz
[root@node1 data]# ll apache-tomcat-8.5.42.tar.gz
-rw-r--r-- 1 root root 9711748 Jun 20 2019 apache-tomcat-8.5.42.tar.gz
[root@node1 data]# tar xf apache-tomcat-8.5.42.tar.gz -C /usr/local/
[root@node1 data]# cd /usr/local/
[root@node1 local]# ln -sv apache-tomcat-8.5.42 tomcat
‘tomcat’ -> ‘apache-tomcat-8.5.42’
[root@node1 local]# ll tomcat
lrwxrwxrwx 1 root root 20 Jan 17 15:23 tomcat -> apache-tomcat-8.5.42
[root@node1 local]# cd tomcat/bin/
[root@node1 bin]# ./catalina.sh --help
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Usage: catalina.sh ( commands ... )