DockerFile解析,自定义镜像Tomcat9

Dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建三步骤:
1、编写dockerfile文件
2、docker build 镜像
3、docker run 容器

DockerFile构建过程解析:

1、Dockerfile内容基础知识
①每条保留字指令都必须为大写字母且后面要跟随至少一个参数
②指令按照从上到下,顺序执行
③#表示注释
④每条指令都会创建一个新的镜像层,并对镜像进行提交
2、Docker执行Dockerfile的大致流程
①docker从基础镜像运行一个容器
②执行一条指令并对容器做出修改
③执行类似docker commit的操作提交一个新的镜像层
④docker再基于刚提交的镜像运行一个新容器
⑤执行dockerfile中的下一条指令直到所有指令都执行完成
3、总结
从应用软件的角度来看,dockerfile、docker镜像与docker容器分别代表软件的三个不同阶段,

  • dockerfile是软件的原材料

  • docker镜像是软件的交付品

  • docker容器则可以认为是软件的运行态。

    Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
    Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码活着是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等。
    Docker镜像,在用dockerfile定义一个文件后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务。
    Docker容器,容器是直接提供服务的。

DockerFile体系结构(保留字指令)

  • FROM 基础镜像,当前新镜像是基于哪个镜像的
  • MAINTAINER 镜像维护者的姓名和邮箱地址
  • RUN 容器构建时需要运行的命令
  • EXPOSE 当前容器对外暴露的端口
  • WORKDIR 指定在创建容器后,总段默认登陆的进来工作目录,一个落脚点
  • ENV
    ENV MY_PATH /usr/wytest
    这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样
    也可以在其他指令中直接使用这些环境变量,比如:WORKDIOR $MY_PATH
  • ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY 类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
  • VOLUME 容器数据卷,用于数据保存和持久化工作
  • CMD 指定一个容器启动时要运行的命令
    Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
  • ENTRYPOINT 指定一个容器启动时要运行的命令
    ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
  • ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

案例

Base镜像(scratch) Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
自定义镜像mycentos:
1、编写
Hub默认Centos镜像什么情况

[root@hadoop101 /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ghj/centos          latest              ea55868fb6d4        22 hours ago        202MB
atdixin/mytomcat    7.0                 38d1e8f04740        3 days ago          508MB
nginx               latest              f949e7d76d63        5 days ago          126MB
tomcat              latest              8973f493aa0a        9 days ago          508MB
centos              latest              67fa590cfc1c        5 weeks ago         202MB
hello-world         latest              fce289e99eb9        9 months ago        1.84kB
training/webapp     latest              6fae60ef3446        4 years ago         349MB
[root@hadoop101 /]# docker run -it centos /bin/bash
[root@89f6f4831dd9 /]# pwd
/
[root@89f6f4831dd9 /]# vim abc.txt
bash: vim: command not found
[root@89f6f4831dd9 /]# ifconfig
bash: ifconfig: command not found

①初始centos运行该镜像进入默认路径是/
②默认不支持vim和ifconfig
自定义mycentos目的使我们自己的镜像具备如下:
①登陆后的默认路径
②支持vim编辑器和查看网络配置ifconfig支持
准备编写DockerFile文件

[root@hadoop101 /]# cd mydocker/
[root@hadoop101 mydocker]# ll
总用量 4
-rw-r--r--. 1 root root 133 9月  29 10:43 Dockerfile
[root@hadoop101 mydocker]# vim Dockerfile2
------------------------------------------------------------------------------------------------
FROM centos
MAINTAINER ghj.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success-------ok"
CMD /bin/bash

myCentos内容DockerFile
2、构建
docker build -t 新镜像名字:TAG.
注意最后有一个. 表示当前目录

[root@hadoop101 mydocker]#  docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 .
Successfully built d9dff72321ec
Successfully tagged mycentos:1.3
[root@hadoop101 mydocker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.3                 d9dff72321ec        13 minutes ago      350MB
ghj/centos          latest              ea55868fb6d4        30 hours ago        202MB
atdixin/mytomcat    7.0                 38d1e8f04740        4 days ago          508MB
nginx               latest              f949e7d76d63        5 days ago          126MB
tomcat              latest              8973f493aa0a        10 days ago         508MB
centos              latest              67fa590cfc1c        5 weeks ago         202MB
hello-world         latest              fce289e99eb9        9 months ago        1.84kB
training/webapp     latest              6fae60ef3446        4 years ago         349MB

3、运行

[root@hadoop101 ~]# docker run -it mycentos:1.3
[root@12fb3443ef0f local]# pwd
/usr/local

此时运行容器可以发现,我们通过DockerFile文件配置的ENV 的路径就是运行容器直接进入的路径
4、列出镜像的变更历史

[root@hadoop101 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.3                 d9dff72321ec        7 days ago          350MB
ghj/centos          latest              ea55868fb6d4        9 days ago          202MB
atdixin/mytomcat    7.0                 38d1e8f04740        11 days ago         508MB
nginx               latest              f949e7d76d63        13 days ago         126MB
tomcat              latest              8973f493aa0a        2 weeks ago         508MB
centos              latest              67fa590cfc1c        6 weeks ago         202MB
hello-world         latest              fce289e99eb9        9 months ago        1.84kB
training/webapp     latest              6fae60ef3446        4 years ago         349MB
[root@hadoop101 ~]# docker history d9dff72321ec
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
d9dff72321ec        7 days ago          /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
3abd63b182b2        7 days ago          /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
8619d9c27954        7 days ago          /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
88c714721366        7 days ago          /bin/sh -c #(nop)  EXPOSE 80                    0B                  
18070c333f54        7 days ago          /bin/sh -c yum -y install net-tools             23.7MB              
53d10d80a787        7 days ago          /bin/sh -c yum -y install vim                   124MB               
73e7f7cff11c        7 days ago          /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
249da334797f        7 days ago          /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
15c91369a1cc        7 days ago          /bin/sh -c #(nop)  MAINTAINER ghj
67fa590cfc1c        6 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
           6 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
           6 weeks ago         /bin/sh -c #(nop) ADD file:4e7247c06de9ad117…   202MB

很明显是根据DockerFile的配置文件逐层加载的。
CMD/ENTRYPOINT镜像案例
都是指定一个容器启动时要运行的命令
CMD:dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
Case
在Docker Hub上找到tomcat的DockerFile文件如下

FROM adoptopenjdk:8-jdk-openj9
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR
# see https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/KEYS# see also "update.sh" (https://github.com/docker-library/tomcat/blob/master/update.sh)ENV GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 713DA88BE50911535FE716F5208B0AB1D63011C7 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23
ENV TOMCAT_MAJOR 8
ENV TOMCAT_VERSION 8.5.46
ENV TOMCAT_SHA512 9d6243ec47ec0f431c55a612fa6a8fac00262ed2731640ad98628b275221d3e8e241b2fee748196b64029997f4d9f8e63831b43986fedb88a62381a92b05ca68
RUN set -eux; \	\	savedAptMark="$(apt-mark showmanual)"; \	apt-get update; \	apt-get install -y --no-install-recommends \		gnupg dirmngr \		wget ca-certificates \	; \	\	ddist() { \		local f="$1"; shift; \		local distFile="$1"; shift; \		local success=; \		local distUrl=; \		for distUrl in \# https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394			'https://www.apache.org/dyn/closer.cgi?action=download&filename=' \# if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/			https://www-us.apache.org/dist/ \			https://www.apache.org/dist/ \			https://archive.apache.org/dist/ \		; do \			if wget -O "$f" "$distUrl$distFile" && [ -s "$f" ]; then \				success=1; \				break; \			fi; \		done; \		[ -n "$success" ]; \	}; \	\	ddist 'tomcat.tar.gz' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz"; \	echo "$TOMCAT_SHA512 *tomcat.tar.gz" | sha512sum --strict --check -; \	ddist 'tomcat.tar.gz.asc' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc"; \	export GNUPGHOME="$(mktemp -d)"; \	for key in $GPG_KEYS; do \		gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \	done; \	gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz; \	tar -xf tomcat.tar.gz --strip-components=1; \	rm bin/*.bat; \	rm tomcat.tar.gz*; \	command -v gpgconf && gpgconf --kill all || :; \	rm -rf "$GNUPGHOME"; \	\	nativeBuildDir="$(mktemp -d)"; \	tar -xf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1; \	apt-get install -y --no-install-recommends \		dpkg-dev \		gcc \		libapr1-dev \		libssl-dev \		make \	; \	( \		export CATALINA_HOME="$PWD"; \		cd "$nativeBuildDir/native"; \		gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \		aprConfig="$(command -v apr-1-config)"; \		./configure \			--build="$gnuArch" \			--libdir="$TOMCAT_NATIVE_LIBDIR" \			--prefix="$CATALINA_HOME" \			--with-apr="$aprConfig" \			--with-java-home="$JAVA_HOME" \			--with-ssl=yes; \		make -j "$(nproc)"; \		make install; \	); \	rm -rf "$nativeBuildDir"; \	rm bin/tomcat-native.tar.gz; \	\# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies	apt-mark auto '.*' > /dev/null; \	[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \	find "$TOMCAT_NATIVE_LIBDIR" -type f -executable -exec ldd '{}' ';' \		| awk '/=>/ { print $(NF-1) }' \		| sort -u \		| xargs -r dpkg-query --search \		| cut -d: -f1 \		| sort -u \		| xargs -r apt-mark manual \	; \	apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \	rm -rf /var/lib/apt/lists/*; \	\# sh removes env vars it doesn't support (ones with periods)# https://github.com/docker-library/tomcat/issues/77	find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; \	\# fix permissions (especially for running as non-root)# https://github.com/docker-library/tomcat/issues/35	chmod -R +rX .; \	chmod 777 logs temp work
# verify Tomcat Native is working properly
RUN set -e \	&& nativeLines="$(catalina.sh configtest 2>&1)" \	&& nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" \	&& nativeLines="$(echo "$nativeLines" | sort -u)" \	&& if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then \		echo >&2 "$nativeLines"; \		exit 1; \	fi
EXPOSE 8080
CMD ["catalina.sh", "run"]
[root@hadoop101 ~]# docker images tomcat
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              latest              8973f493aa0a        2 weeks ago         508MB
[root@hadoop101 ~]# docker run -it -p 7777:8080 tomcat ls -l
total 124
-rw-r--r--. 1 root root  19318 Sep 16 18:19 BUILDING.txt
-rw-r--r--. 1 root root   5407 Sep 16 18:19 CONTRIBUTING.md
-rw-r--r--. 1 root root  57011 Sep 16 18:19 LICENSE
-rw-r--r--. 1 root root   1726 Sep 16 18:19 NOTICE
-rw-r--r--. 1 root root   3255 Sep 16 18:19 README.md
-rw-r--r--. 1 root root   7139 Sep 16 18:19 RELEASE-NOTES
-rw-r--r--. 1 root root  16262 Sep 16 18:19 RUNNING.txt
drwxr-xr-x. 2 root root   4096 Sep 20 01:40 bin
drwxr-sr-x. 2 root root    238 Sep 16 18:19 conf
drwxr-sr-x. 2 root staff    78 Sep 20 01:40 include
drwxr-xr-x. 2 root root   4096 Sep 20 01:40 lib
drwxrwxrwx. 2 root root      6 Sep 16 18:17 logs
drwxr-sr-x. 3 root staff   151 Sep 20 01:40 native-jni-lib
drwxrwxrwx. 2 root root     30 Sep 20 01:40 temp
drwxr-xr-x. 7 root root     81 Sep 16 18:17 webapps
drwxrwxrwx. 2 root root      6 Sep 16 18:17 work

此时可以看出执行的路径就是dockerfile中ENV CATALINA_HOME /usr/local/tomcat

[root@hadoop101 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
12fb3443ef0f        mycentos:1.3        "/bin/sh -c /bin/bash"   2 hours ago         Up 2 hours          80/tcp              beautiful_volhard

然而ps发现tomcat并没有起,因为ls -l的命令覆盖了DockerFile中的CMD [“catalina.sh”, “run”]
ENTRYPOINT:docker run 之后得参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合
Case:
制作CMD版可以查询IP信息得容器

[root@hadoop101 /]# cd mydocker/
[root@hadoop101 mydocker]# ll
总用量 8
-rw-r--r--. 1 root root 133 9月  29 10:43 Dockerfile
-rw-r--r--. 1 root root 214 9月  30 16:10 Dockerfile2
[root@hadoop101 mydocker]# vim Dockerfile3
FROM centos
RUN yum install -y curl
CMD ["curl","-s","https://ip.cn"]
[root@hadoop101 mydocker]# docker build -f /mydocker/Dockerfile3 -t myip .
[root@hadoop101 ~]# docker images myip
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myip                latest              07ad4fcefbba        4 minutes ago       276MB
[root@hadoop101 mydocker]# docker run -it myip
{"ip": "218.24.66.234", "country": "辽宁省沈阳市", "city": "联通"} 

curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。
如果系统没有curl可以使用yum install curl安装,也可以下载安装。
curl是将下载文件输出到stdout
使用命令:curl http://www.baidu.com
执行后,www.baidu.com的html就会显示在屏幕上了
这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将只显示文件头部,即HTML文档的header。要全部显示,请加参数-i。

问题:如果我们希望显示HTTP显示头信息,就需要加上-i参数

[root@hadoop101 mydocker]# curl -i https://ip.cn
HTTP/1.1 200 OK
Date: Tue, 08 Oct 2019 07:13:51 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=d51fb1433051d9bb83dca8ad9bf3749491570518831; expires=Wed, 07-Oct-20 07:13:51 GMT; path=/; domain=.ip.cn; HttpOnly
CF-Cache-Status: DYNAMIC
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 52265088dba6d392-LAX
{"ip": "218.24.66.234", "country": "辽宁省沈阳市", "city": "联通"}
[root@hadoop101 mydocker]# docker run myip -i
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"-i\": executable file not found in $PATH": unknown.

Why?我们可以看到可执行文件找不到的报错,executable file not found之前我们说过,跟在镜像后面的是command,运行时会替换CMD的默认值。因此这里的-i替换了原来的CMD,而不是添加在原来的curl -s http://ip.cn后面。而-i根本不是命令,所以自然找不到。那么如果我们希望加入-i这参数,我们就必须重新完整的输入这个命令:

[root@hadoop101 mydocker]# docker run myip curl -s http://ip.cn -i

制作ENTRYPOINT版查询IP信息得容器

[root@hadoop101 mydocker]# vim Dockerfile4
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","https://ip.cn"]
[root@hadoop101 mydocker]# docker build -f /mydocker/Dockerfile4 -t myip2 .
[root@hadoop101 mydocker]# docker run myip2 -i

此时就不会再报错。
下面介绍的是继承

[root@hadoop101 mydocker]# vim Dockerfile4
FROM centos
RUN yum install -y curl
CMD ["curl","-s","https://ip.cn"]
ONBUILD RUN echo "father images onbuild---------886"
[root@hadoop101 mydocker]# docker build -f /mydocker/Dockerfile4 -t myip_father .
Sending build context to Docker daemon  7.168kB
Step 1/4 : FROM centos
 ---> 67fa590cfc1c
Step 2/4 : RUN yum install -y curl
 ---> Using cache
 ---> 5a49cc28a490
Step 3/4 : ENTRYPOINT ["curl","-s","https://ip.cn"]
 ---> Using cache
 ---> f9cf5df7c0f5
Step 4/4 : ONBUILD RUN echo "father images onbuild---------886"
 ---> Running in 9f9e77c00e27
Removing intermediate container 9f9e77c00e27
 ---> eb89c741f944
Successfully built eb89c741f944
Successfully tagged myip_father:latest
[root@hadoop101 mydocker]# vim Dockerfile5
FROM myip_father
RUN yum install -y curl
CMD ["curl","-s","https://ip.cn"]
[root@hadoop101 mydocker]# docker build -f /mydocker/Dockerfile5 -t myip_son .
Sending build context to Docker daemon  8.192kB
Step 1/3 : FROM myip_father
# Executing 1 build trigger
 ---> Running in b7152c74c107
father images onbuild---------886
Removing intermediate container b7152c74c107
 ---> 62a88bd9a34f
Step 2/3 : RUN yum install -y curl
 ---> Running in 3b75719030f3
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Package curl-7.29.0-54.el7.x86_64 already installed and latest version
Nothing to do
Removing intermediate container 3b75719030f3
 ---> 0db722fd1b51
Step 3/3 : CMD ["curl","-s","https://ip.cn"]
 ---> Running in 932472dc8a63
Removing intermediate container 932472dc8a63
 ---> bce3f7f4efcd
Successfully built bce3f7f4efcd
Successfully tagged myip_son:latest

自定义镜像Tomcat9
第一步:mkdir -p /ghj/mydockerfile/tomcat9

[root@hadoop101 ~]# mkdir -p /ghj/mydockerfile/tomcat9
[root@hadoop101 /]# cd /ghj/mydockerfile/tomcat9/

第二步:在上述目录下touch.txt

[root@hadoop101 tomcat9]# touch c.txt
[root@hadoop101 tomcat9]# ll
总用量 0
-rw-r--r--. 1 root root 0 10月  8 16:19 c.txt

第三步:将jdk和tomcat安装的压缩包拷贝进上一步目录

[root@hadoop101 tomcat9]# ll
总用量 197352
-rw-r--r--. 1 root root  12326996 10月  8 16:45 apache-tomcat-9.0.26.tar.gz
-rw-r--r--. 1 root root         0 10月  8 16:19 c.txt
-rw-r--r--. 1 root root         0 10月  8 16:59 Dockerfile
-rw-r--r--. 1 root root 189756259 10月  8 16:45 jdk-8u161-linux-x64.tar.gz

第四步:在/ghj/mydockerfile/tomcat9目录下新建Dockerfile文件

[root@hadoop101 tomcat9]# vim Dockerfile 
FROM centos
MAINTAINER ghj.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD apache-tomcat-9.0.26.tar.gz /usr/local/
ADD jdk-8u161-linux-x64.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量 
ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.26
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.26
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
#ENTRYPOINT ["usr/local/apache-tomcat-9.0.26/bin/startup.sh"]
#CMD ["usr/local/apache-tomcat-9.0.26/bin/catalina,sh","run"]
CMD /usr/local/apache-tomcat-9.0.26/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.26/bin/logs/catalina.out
[root@hadoop101 tomcat9]# docker build -t ghjtomcat9 .
[root@hadoop101 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
ghjtomcat9          latest              d824ff2c00c6        About a minute ago   732MB
myip_son            latest              bce3f7f4efcd        23 hours ago         277MB
myip_father         latest              eb89c741f944        23 hours ago         276MB
myip2               latest              f9cf5df7c0f5        24 hours ago         276MB
myip                latest              166ac61dcd1b        24 hours ago         276MB
mycentos            1.3                 d9dff72321ec        8 days ago           350MB
ghj/centos          latest              ea55868fb6d4        10 days ago          202MB
atdixin/mytomcat    7.0                 38d1e8f04740        13 days ago          508MB
nginx               latest              f949e7d76d63        2 weeks ago          126MB
tomcat              latest              8973f493aa0a        2 weeks ago          508MB
centos              latest              67fa590cfc1c        7 weeks ago          202MB
hello-world         latest              fce289e99eb9        9 months ago         1.84kB
training/webapp     latest              6fae60ef3446        4 years ago          349MB

第六步:RUN

[root@hadoop101 ~]# docker run -d -p 9080:8080 --name myt9 -v /ghj/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.26/webapps/test -v /ghj/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.26/logs --privileged=true ghjtomcat9
55f550de949f063ec987fa678e1acc6e4692400405f1316912019297541ba4bd
[root@hadoop101 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
55f550de949f        ghjtomcat9          "/bin/sh -c '/usr/lo…"   7 seconds ago       Up 6 seconds        0.0.0.0:9080->8080/tcp   myt9
[root@hadoop101 ~]# docker exec 55f550de949f ls -l
total 0
drwxr-xr-x. 1 root root  45 Oct  9 07:02 apache-tomcat-9.0.26
drwxr-xr-x. 2 root root   6 Apr 11  2018 bin
-rw-r--r--. 1 root root   0 Oct  8 08:19 cincontainer.txt
drwxr-xr-x. 2 root root   6 Apr 11  2018 etc
drwxr-xr-x. 2 root root   6 Apr 11  2018 games
drwxr-xr-x. 2 root root   6 Apr 11  2018 include
drwxr-xr-x. 8   10  143 255 Dec 20  2017 jdk1.8.0_161
drwxr-xr-x. 2 root root   6 Apr 11  2018 lib
drwxr-xr-x. 2 root root   6 Apr 11  2018 lib64
drwxr-xr-x. 2 root root   6 Apr 11  2018 libexec
drwxr-xr-x. 2 root root   6 Apr 11  2018 sbin
drwxr-xr-x. 5 root root  49 Aug  1 01:09 share
drwxr-xr-x. 2 root root   6 Apr 11  2018 src
[root@hadoop101 tomcat9]# docker exec 55f550de949f ls -l /usr/local
total 0
drwxr-xr-x. 1 root root  45 Oct  9 07:02 apache-tomcat-9.0.26
drwxr-xr-x. 2 root root   6 Apr 11  2018 bin
-rw-r--r--. 1 root root   0 Oct  8 08:19 cincontainer.txt
drwxr-xr-x. 2 root root   6 Apr 11  2018 etc
drwxr-xr-x. 2 root root   6 Apr 11  2018 games
drwxr-xr-x. 2 root root   6 Apr 11  2018 include
drwxr-xr-x. 8   10  143 255 Dec 20  2017 jdk1.8.0_161
drwxr-xr-x. 2 root root   6 Apr 11  2018 lib
drwxr-xr-x. 2 root root   6 Apr 11  2018 lib64
drwxr-xr-x. 2 root root   6 Apr 11  2018 libexec
drwxr-xr-x. 2 root root   6 Apr 11  2018 sbin
drwxr-xr-x. 5 root root  49 Aug  1 01:09 share
drwxr-xr-x. 2 root root   6 Apr 11  2018 src

第七步:验证
DockerFile解析,自定义镜像Tomcat9_第1张图片
第八步:结合前述的容器卷将测试的web服务test发布

[root@hadoop101 tomcat9]# ll
总用量 197356
-rw-r--r--. 1 root root  12326996 10月  8 16:45 apache-tomcat-9.0.26.tar.gz
-rw-r--r--. 1 root root         0 10月  8 16:19 c.txt
-rw-r--r--. 1 root root      1033 10月  9 15:00 Dockerfile
-rw-r--r--. 1 root root 189756259 10月  8 16:45 jdk-8u161-linux-x64.tar.gz
drwxr-xr-x. 2 root root         6 10月  9 15:06 test
drwxr-xr-x. 2 root root       197 10月  9 15:06 tomcat9logs
[root@hadoop101 tomcat9]# docker exec 55f550de949f java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

总体概述:

[root@hadoop101 tomcat9]# cd test/
[root@hadoop101 test]# pwd
/ghj/mydockerfile/tomcat9/test

web.xml

[root@hadoop101 test]# mkdir WEB-INF
[root@hadoop101 test]# cd WEB-INF/
[root@hadoop101 WEB-INF]# vim web.xml
"1.0" encoding="UTF-8"?>
-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 id="WebApp_ID" version="2.5">

  -name>test</display-name>
</web-app>  

a.jsp

[root@hadoop101 WEB-INF]# cd ..
[root@hadoop101 test]# ll
总用量 0
drwxr-xr-x. 2 root root 32 10月  9 15:42 WEB-INF
[root@hadoop101 test]# vim a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">


    -equiv="content-type" content="text/html;charset=UTF-8">
    Insert title here<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>
<span class="token operator">--</span>-<span class="token operator">--</span>-<span class="token operator">--</span>-<span class="token operator">-</span>welcome-<span class="token operator">--</span>-<span class="token operator">--</span>-<span class="token operator">--</span>-<span class="token operator">-</span>
<<span class="token operator">%=</span><span class="token string">"i am in docker tomcat self"</span><span class="token operator">%</span>>
<br>
<br>
<<span class="token operator">%</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"============docker tomcat self"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">%</span>>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>
<span class="token namespace">[root@hadoop101 test]</span><span class="token comment"># pwd</span>
<span class="token operator">/</span>ghj<span class="token operator">/</span>mydockerfile<span class="token operator">/</span>tomcat9<span class="token operator">/</span>test
<span class="token namespace">[root@hadoop101 test]</span><span class="token comment"># ll</span>
总用量 4
<span class="token operator">-</span>rw<span class="token operator">-</span>r-<span class="token operator">-</span>r-<span class="token operator">-</span><span class="token punctuation">.</span> 1 root root 470 10月  9 16:09 a<span class="token punctuation">.</span>jsp
drwxr<span class="token operator">-</span>xr<span class="token operator">-</span>x<span class="token punctuation">.</span> 2 root root  32 10月  9 15:42 WEB<span class="token operator">-</span>INF
<span class="token namespace">[root@hadoop101 test]</span><span class="token comment"># docker exec 55f550de949f ls -l /usr/local/apache-tomcat-9.0.26/webapps/test</span>
total 4
drwxr<span class="token operator">-</span>xr<span class="token operator">-</span>x<span class="token punctuation">.</span> 2 root root  32 Oct  9 07:42 WEB<span class="token operator">-</span>INF
<span class="token operator">-</span>rw<span class="token operator">-</span>r-<span class="token operator">-</span>r-<span class="token operator">-</span><span class="token punctuation">.</span> 1 root root 470 Oct  9 08:09 a<span class="token punctuation">.</span>jsp</code></pre> 
  <p>注:宿主机上写的东西根据容器数据卷的共享,容器中也会有的。<br> 测试<br> 重启容器</p> 
  <pre><code class="prism language-powershell"><span class="token namespace">[root@hadoop101 test]</span><span class="token comment"># docker ps</span>
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
55f550de949f        ghjtomcat9          <span class="token string">"/bin/sh -c '/usr/lo…"</span>   About an hour ago   Up About an hour    0<span class="token punctuation">.</span>0<span class="token punctuation">.</span>0<span class="token punctuation">.</span>0:9080<span class="token operator">-</span>>8080<span class="token operator">/</span>tcp   myt9
<span class="token namespace">[root@hadoop101 test]</span><span class="token comment"># docker restart 55f550de949f</span>
55f550de949f</code></pre> 
  <p><a href="http://img.e-com-net.com/image/info8/0a8c7e7fc1ab436faf3e3a30078b0d1b.jpg" target="_blank"><img alt="DockerFile解析,自定义镜像Tomcat9_第2张图片" src="http://img.e-com-net.com/image/info8/0a8c7e7fc1ab436faf3e3a30078b0d1b.jpg" width="650" height="470" style="border:1px solid black;"></a></p> 
  <pre><code class="prism language-powershell"><span class="token namespace">[root@hadoop101 test]</span><span class="token comment"># vim a.jsp</span>

<<span class="token operator">%</span>@ page language=<span class="token string">"java"</span> contentType=<span class="token string">"text/html; charset=UTF-8"</span> pageEncoding=<span class="token string">"UTF-8"</span><span class="token operator">%</span>>
<<span class="token operator">!</span>DOCTYPE html PUBLIC <span class="token string">"-//W3C//DTD HTML 4.01 Transitional//EN"</span><span class="token string">"http://www.w3.org/TR/html4/loose.dtd"</span>>
<html>
<head>
    <meta http<span class="token operator">-</span>equiv=<span class="token string">"content-type"</span> content=<span class="token string">"text/html; charset=UTF-8"</span>>
    <title>Insert title here<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>
<span class="token operator">--</span>-<span class="token operator">--</span>-<span class="token operator">--</span>-<span class="token operator">-</span>welcome-<span class="token operator">--</span>-<span class="token operator">--</span>-<span class="token operator">--</span>-<span class="token operator">-</span><br>
<br>
<<span class="token operator">%=</span><span class="token string">"i am in docker tomcat self 1111"</span><span class="token operator">%</span>>
<br>
<br>
<<span class="token operator">%</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"============docker tomcat self"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">%</span>>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html></code></pre> 
  <p><a href="http://img.e-com-net.com/image/info8/a193dd8054894af1935c6af48c585ba0.jpg" target="_blank"><img alt="DockerFile解析,自定义镜像Tomcat9_第3张图片" src="http://img.e-com-net.com/image/info8/a193dd8054894af1935c6af48c585ba0.jpg" width="650" height="419" style="border:1px solid black;"></a></p> 
  <pre><code class="prism language-powershell"><span class="token namespace">[root@hadoop101 tomcat9logs]</span><span class="token comment"># ll</span>
总用量 88
<span class="token operator">-</span>rw<span class="token operator">-</span>r-<span class="token operator">--</span>-<span class="token operator">-</span><span class="token punctuation">.</span> 1 root root 33278 10月  9 16:31 catalina<span class="token punctuation">.</span>2019<span class="token operator">-</span>10<span class="token operator">-</span>09<span class="token punctuation">.</span>log
<span class="token operator">-</span>rw<span class="token operator">-</span>r-<span class="token operator">--</span>-<span class="token operator">-</span><span class="token punctuation">.</span> 1 root root 33464 10月  9 16:50 catalina<span class="token punctuation">.</span>out
<span class="token operator">-</span>rw<span class="token operator">-</span>r-<span class="token operator">--</span>-<span class="token operator">-</span><span class="token punctuation">.</span> 1 root root     0 10月  9 15:06 host<span class="token operator">-</span>manager<span class="token punctuation">.</span>2019<span class="token operator">-</span>10<span class="token operator">-</span>09<span class="token punctuation">.</span>log
<span class="token operator">-</span>rw<span class="token operator">-</span>r-<span class="token operator">--</span>-<span class="token operator">-</span><span class="token punctuation">.</span> 1 root root  9671 10月  9 16:31 localhost<span class="token punctuation">.</span>2019<span class="token operator">-</span>10<span class="token operator">-</span>09<span class="token punctuation">.</span>log
<span class="token operator">-</span>rw<span class="token operator">-</span>r-<span class="token operator">--</span>-<span class="token operator">-</span><span class="token punctuation">.</span> 1 root root  1591 10月  9 16:50 localhost_access_log<span class="token punctuation">.</span>2019<span class="token operator">-</span>10<span class="token operator">-</span>09<span class="token punctuation">.</span>txt
<span class="token operator">-</span>rw<span class="token operator">-</span>r-<span class="token operator">--</span>-<span class="token operator">-</span><span class="token punctuation">.</span> 1 root root     0 10月  9 15:06 manager<span class="token punctuation">.</span>2019<span class="token operator">-</span>10<span class="token operator">-</span>09<span class="token punctuation">.</span>log
<span class="token namespace">[root@hadoop101 tomcat9logs]</span><span class="token comment"># cat catalina.out </span>
============docker tomcat self
============docker tomcat self
============docker tomcat self
============docker tomcat self
============docker tomcat self
============docker tomcat self
刷新几次就会打印几次</code></pre> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1281422329762562048"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(DockerFile解析,自定义镜像Tomcat9)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1884258277865353216.htm"
                           title="macOS Sequoia 15.3 (24D60) Boot ISO 原版可引导镜像下载" target="_blank">macOS Sequoia 15.3 (24D60) Boot ISO 原版可引导镜像下载</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/macos/1.htm">macos</a>
                        <div>macOSSequoia15.3(24D60)BootISO原版可引导镜像下载iPhone镜像、Safari浏览器重大更新和AppleIntelligence等众多全新功能令Mac使用体验再升级请访问原文链接:https://sysin.org/blog/macOS-Sequoia-boot-iso/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgmacOSSequoia将Mac</div>
                    </li>
                    <li><a href="/article/1884258153210638336.htm"
                           title="XML解析" target="_blank">XML解析</a>
                        <span class="text-muted">千禧年@</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a>
                        <div>一、XML概述1,什么是XML?XML即为可扩展的标记语言(eXtensibleMarkupLanguage)XML是一套定义语义标记的规则,这些标记将文档分为许多部件并对这些部件加以标识2.XML和HTML不同之处XML主要用于说明文档的主题,而HTML侧重描述文本的显示格式。XML文档数据和格式分离,文档=文档数据+文档结构+文档样式XML是一种元标记语言,用户可以自己定义标记集,从而使数据具</div>
                    </li>
                    <li><a href="/article/1884252736879390720.htm"
                           title="Python 函数魔法书:基础、范例、避坑、测验与项目实战" target="_blank">Python 函数魔法书:基础、范例、避坑、测验与项目实战</a>
                        <span class="text-muted">李智 - 重庆</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E7%B2%BE%E8%AE%B2%E7%B2%BE%E7%BB%83/1.htm">精讲精练</a><a class="tag" taget="_blank" href="/search/-/1.htm">-</a><a class="tag" taget="_blank" href="/search/%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E6%88%98/1.htm">从入门到实战</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/1.htm">编程技巧</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E5%AE%9E%E6%88%98/1.htm">编程实战</a><a class="tag" taget="_blank" href="/search/%E6%B0%B4%E5%B9%B3%E8%80%83%E8%AF%95/1.htm">水平考试</a>
                        <div>Python函数魔法书:基础、范例、避坑、测验与项目实战内容简介本系列文章是为Python3学习者精心设计的一套全面、实用的学习指南,旨在帮助读者从基础入门到项目实战,全面提升编程能力。文章结构由5个版块组成,内容层层递进,逻辑清晰。基础速通:n个浓缩提炼的核心知识点,夯实编程基础;经典范例:10个贴近实际的应用场景,深入理解Python3的编程技巧和应用方法;避坑宝典:10个典型错误解析,提供解</div>
                    </li>
                    <li><a href="/article/1884246053499236352.htm"
                           title="Docker最新安装教程基于centos7.9" target="_blank">Docker最新安装教程基于centos7.9</a>
                        <span class="text-muted">Acerola-</span>
<a class="tag" taget="_blank" href="/search/%E8%8F%9C%E9%B8%A1%E4%B8%8A%E8%B7%AF/1.htm">菜鸡上路</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a>
                        <div>1.基本准备Docker要求内核版本3.10以上,请务必注意,安装教程基于centos7.9,内核版本3.10.0-1160.11.1.el7.x86_64#查看内核版本命令uname-r2.安装以下步骤依次进行#安装环境依赖yuminstall-yyum-utils#设置下载Docker的镜像源yum-config-manager\--add-repo\https://zfzbet67.mirr</div>
                    </li>
                    <li><a href="/article/1884242651079831552.htm"
                           title="node.js学习记录——npm下包慢、" target="_blank">node.js学习记录——npm下包慢、</a>
                        <span class="text-muted">VIXeH</span>
<a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                        <div>从npm官网下载速度会很慢,可以从taobao的镜像服务器来下,该指令修改了npm下载包的默认地址,改成了taobao的镜像服务器。npmconfigsetregistry=https://registry.npm.taobao.org/查看是否修改成功更方便的方法//通过npm包管理器,将nrm安装为全局可用的工具npminrm-g//查看所有可用的镜像源nrmls/将下包的镜像源切换为taob</div>
                    </li>
                    <li><a href="/article/1884238738503036928.htm"
                           title="springboot中aop的写法" target="_blank">springboot中aop的写法</a>
                        <span class="text-muted">coderzjy</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                        <div>自定义注解注解用于标识需要进行代码增强的方法@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceAutoFill{OperationTypevalue();}target注解标识注解生效类型,retention指定注解的保留周期,OperationType为枚举类型,指定属性值的类型,value</div>
                    </li>
                    <li><a href="/article/1884238484080750592.htm"
                           title="vue3:mitt" target="_blank">vue3:mitt</a>
                        <span class="text-muted">米粒宝的爸爸</span>
<a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>在Vue3中使用mitt进行事件总线的实现非常简单。mitt是一个轻量级的事件库,适用于Vue项目中的组件间通信。实现自定义组件直接相互传值,父到子,子到子,子对子,子对孙,想怎么传就怎么传。和android的Eventbus一个玩法1.下载mittnpmimittmac下载,如果权限不够,加sudo2.创建个公共的utils类-emitter.ts//引入mittimportmittfrom'm</div>
                    </li>
                    <li><a href="/article/1884222213268238336.htm"
                           title="【设计模式-行为型】解释器模式" target="_blank">【设计模式-行为型】解释器模式</a>
                        <span class="text-muted">博一波</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E8%A7%A3%E9%87%8A%E5%99%A8%E6%A8%A1%E5%BC%8F/1.htm">解释器模式</a>
                        <div>一、什么是解释器模式到此为止23种解释器都将介绍完毕,下面说最后一个设计模式解释器模式。有许多谍战剧大家都会看过,在谍战剧中经常会有一些主要情节需要进行加密传递。间谍会接受或者发送加密信息。比如用收音机接收指令或者消息。间谍会根据特定的解码书去解码收音机传递过来的指令。同样的情节,在电视剧《潜伏》中也经常会出现。解释器模式为自定义语言的设计和实现提供了一种解决方案,它用于定义一组文法规则并通过这组</div>
                    </li>
                    <li><a href="/article/1884215905131491328.htm"
                           title="Linux(UOS系统:DHCP)" target="_blank">Linux(UOS系统:DHCP)</a>
                        <span class="text-muted">Jackson~Y</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/1.htm">网络系统管理</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>赛题拓扑:题目:DHCP为OutsideCli客户端网络分配地址,地址池范围:81.6.63.110-81.6.63.190/24。域名解析服务器:按照实际需求配置DNS服务器地址选项。网关:按照实际需求配置网关地址选项。root@ispsrv:~#aptinstallisc-dhcp-server-yroot@ispsrv:~#vim/etc/default/isc-dhcp-serverINT</div>
                    </li>
                    <li><a href="/article/1884206325030776832.htm"
                           title="optee gprof" target="_blank">optee gprof</a>
                        <span class="text-muted">代码改变世界ctw</span>
<a class="tag" taget="_blank" href="/search/optee%E7%B2%BE%E9%80%89/1.htm">optee精选</a><a class="tag" taget="_blank" href="/search/gprof/1.htm">gprof</a><a class="tag" taget="_blank" href="/search/ftrace/1.htm">ftrace</a><a class="tag" taget="_blank" href="/search/%E8%B0%83%E8%AF%95/1.htm">调试</a><a class="tag" taget="_blank" href="/search/optee/1.htm">optee</a><a class="tag" taget="_blank" href="/search/TEE/1.htm">TEE</a><a class="tag" taget="_blank" href="/search/trustzone/1.htm">trustzone</a>
                        <div>快速链接:.《optee精选全集》付费专栏-[目录]付费专栏-付费课程【购买须知】目录思考什么是opteeGprof?开启opteegprofgprof解析生成的文件思考什么是opteeGprof?如何开启opteegprof?opteegprof和linuxgprof有什么不同?什么是opteeGprof?Gprof是一种性能分析工具,用于收集程序的运行时性能数据,主要用于分析函数的调用关系和运</div>
                    </li>
                    <li><a href="/article/1884199392819343360.htm"
                           title="java 高级工程师面试题集锦,持续更新~" target="_blank">java 高级工程师面试题集锦,持续更新~</a>
                        <span class="text-muted">aifans_bert</span>
<a class="tag" taget="_blank" href="/search/java%E5%AD%A6%E4%B9%A0/1.htm">java学习</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>找大厂面试题,看套路!Java面试题及答案及面试解析说到找工作,你认为现在最重要的事情是什么?当然找大厂面试题,看套路!以下面试题就是小编为大家准备的,希望对大家有用!1.面向对象的特征请阅读严宏博士的Java模式或设计模式解释中的桥梁模式)。封装:一般认为封装是将数据和操作数据的方法绑定起来,数据的访问只能通过定义。吐血总结!50道Python面试题集锦(附答案)这些面试题涉及Python基础知</div>
                    </li>
                    <li><a href="/article/1884198509515698176.htm"
                           title="【自己动手开发Webpack插件:开启前端构建工具的个性化定制之旅】" target="_blank">【自己动手开发Webpack插件:开启前端构建工具的个性化定制之旅】</a>
                        <span class="text-muted">Orange301511</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%89%8D%E7%AB%AF/1.htm">大前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</a>
                        <div>在前端开发的世界里,Webpack无疑是构建工具中的“明星”。它强大的功能可以帮助我们高效地打包和管理前端资源。然而,有时候默认的Webpack功能可能无法完全满足我们的特定需求,这时候就需要自定义Webpack插件来大展身手啦!今天,我们就来一起探索如何开发自己的Webpack插件。一、什么是Webpack插件?Webpack插件就像是一个神奇的小助手,在Webpack打包的过程中,在特定的时刻</div>
                    </li>
                    <li><a href="/article/1884184006807842816.htm"
                           title="Linux下BIND安装与配置详解:正向解析、反向解析、主从域名服务器的搭建" target="_blank">Linux下BIND安装与配置详解:正向解析、反向解析、主从域名服务器的搭建</a>
                        <span class="text-muted">shyuu_</span>
<a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E8%AE%A1%E7%AE%97/1.htm">云计算</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>文章目录案例:BIND安装与配置详解一、安装BIND软件包二、配置BIND主服务器(正向解析)三、配置反向解析四、配置主从DNS服务器及自动同步案例:BIND安装与配置详解一、安装BIND软件包安装BIND软件包通过网络源或挂载的光盘安装BIND:yuminstallbind-y或者通过RPM包安装,前提是挂载系统盘ISO镜像:rpm-ivhbind-x.x.x-x.el7.x86_64.rpm查</div>
                    </li>
                    <li><a href="/article/1884177697228255232.htm"
                           title="Spring Boot 接口防抖 + AOP注解 + 自定义异常处理 (防重复提交)的实现方案" target="_blank">Spring Boot 接口防抖 + AOP注解 + 自定义异常处理 (防重复提交)的实现方案</a>
                        <span class="text-muted">cherry5230</span>
<a class="tag" taget="_blank" href="/search/Spring/1.htm">Spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                        <div>前言在开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧</div>
                    </li>
                    <li><a href="/article/1884177064286810112.htm"
                           title="常用的前端4种请求方式" target="_blank">常用的前端4种请求方式</a>
                        <span class="text-muted">紫水木鱼</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>文章目录一、GET请求1.1使用方式1.2优缺点1.3应用场景二、POST请求2.1使用方式2.2优缺点2.3应用场景三、PUT请求3.1使用方式3.2优缺点3.3应用场景四、DELETE请求4.1使用方式4.2优缺点4.3应用场景五.总结一、GET请求GET请求用于向指定资源发出请求,请求中包含了资源的URL和请求参数。服务器端通过解析请求参数来返回相应的资源,不会修改服务器端的状态。1.1使用</div>
                    </li>
                    <li><a href="/article/1884176178982481920.htm"
                           title="Python json.load() 和 json.loads()及json.dump()和json.dumps()的区别" target="_blank">Python json.load() 和 json.loads()及json.dump()和json.dumps()的区别</a>
                        <span class="text-muted">知识的宝藏</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E8%BE%91%E5%99%A8/1.htm">编辑器</a>
                        <div>json.load()和json.loads()json.load()和json.loads()都是Python中用于处理JSON数据的函数,它们之间的主要区别在于它们从何处读取JSON数据。json.load():这个函数用于从文件对象(例如,通过open()函数打开的文件)中读取JSON数据,并将其解析为Python对象。它通常用于从文件中读取JSON数据。例如:importjsonwitho</div>
                    </li>
                    <li><a href="/article/1884175797690888192.htm"
                           title="python split() 和 chunk() 的区别" target="_blank">python split() 和 chunk() 的区别</a>
                        <span class="text-muted">Joyner2018</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在编程中,使用split()和chunk()的选择取决于具体的应用场景和需求。两者的功能有所不同:1.在python中split()方法作用:通常用于将字符串分割成子字符串列表。例如,在Python中:split()是基于一个分隔符(如空格、逗号等)分割字符串。优点:简单直观:用于处理基于某些字符或模式分割的字符串。高效:对于解析固定格式的字符串非常高效,例如CSV数据或日志解析。广泛支持:几乎所</div>
                    </li>
                    <li><a href="/article/1884170125045723136.htm"
                           title="详解 Python 中的json.loads和json.dumps方法:中英双语" target="_blank">详解 Python 中的json.loads和json.dumps方法:中英双语</a>
                        <span class="text-muted">阿正的梦工坊</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/microsoft/1.htm">microsoft</a>
                        <div>中文版详解Python中的json.loads和json.dumps方法在Python的标准库中,json模块用于处理JSON数据格式。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,广泛用于前后端交互以及数据存储。json.loads和json.dumps是json模块中最常用的两个方法,分别用于解析JSON字符串和将Python对象序列化为JSON字符串</div>
                    </li>
                    <li><a href="/article/1884164829636259840.htm"
                           title="【Java基础-41.5】深入解析Java异常链:构建清晰的错误追踪体系" target="_blank">【Java基础-41.5】深入解析Java异常链:构建清晰的错误追踪体系</a>
                        <span class="text-muted">AllenBright</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Java%E5%9F%BA%E7%A1%80/1.htm">Java基础</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在Java编程中,异常处理是保证程序健壮性和可维护性的重要部分。然而,在实际开发中,异常往往不是孤立发生的,而是由一系列相关的异常引发的。为了更好地理解和处理这种复杂的异常场景,Java引入了异常链(ExceptionChaining)的概念。本文将深入探讨异常链的原理、使用方法以及在实际开发中的最佳实践。1.什么是异常链?异常链是指将一个异常与另一个异常关联起来,形成一个链条,从而保留异常的完整</div>
                    </li>
                    <li><a href="/article/1884158268050305024.htm"
                           title="【MySQL】性能测试方法" target="_blank">【MySQL】性能测试方法</a>
                        <span class="text-muted">nickli528</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>本页主要介绍关系数据库MySQL版的性能测试方法。测试环境测试使用ECS和RDS实例均在同一地域、同一可用区。测试使用ECS和RDS实例在同一VPC内。测试使用ECS信息:规格为s6.4xlarge.2镜像为CentOS7.9测试使用RDS信息:规格为S2/S7系列下各规格存储类型为超高IO数据盘400G参数模板为RDS默认参数模板说明1.ECS规格较高是为了保证测试时性能瓶颈不在ECS端。2.R</div>
                    </li>
                    <li><a href="/article/1884157762229825536.htm"
                           title="《Apache Shiro 源码解析》- 11.Shiro 对 Spring 的支持" target="_blank">《Apache Shiro 源码解析》- 11.Shiro 对 Spring 的支持</a>
                        <span class="text-muted">大漠穷秋9527</span>
<a class="tag" taget="_blank" href="/search/%E3%80%8AApache/1.htm">《Apache</a><a class="tag" taget="_blank" href="/search/Shiro/1.htm">Shiro</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E3%80%8B/1.htm">源码解析》</a><a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Shiro/1.htm">Shiro</a><a class="tag" taget="_blank" href="/search/%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86/1.htm">权限管理</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>11.Shiro对Spring的支持Shiro的第一个版本发布于2004年,Spring项目起源于2002年,在Shiro最初的版本中没有与Spring相关的内容。后来,随着Spring的流行,从2010年开始,Shiro开始提供对Spring的支持,推出了一个独立的jar包,名为shiro-spring。从2018年开始,Shiro在v1.4中开始增强对SpringBoot的支持。在本章中,我们</div>
                    </li>
                    <li><a href="/article/1884152595828764672.htm"
                           title="Hook 函数" target="_blank">Hook 函数</a>
                        <span class="text-muted">消失的旧时光-1943</span>
<a class="tag" taget="_blank" href="/search/react%E5%AD%A6%E4%B9%A0/1.htm">react学习</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>引言什么是hook函数?在计算机编程中,hook函数是指在特定的事件发生时被调用的函数,用于在事件发生前或后进行一些特定的操作。通常,hook函数作为回调函数被注册到事件处理器中,当事件发生时,事件处理器会自动调用相应的hook函数。简单理解就是回调函数的触发。那么我突然想到我们在java开发中,自定义接口,做监听接口回调或者kotlin的高阶函数。Java中回调函数的触发或kotlin高阶函数的</div>
                    </li>
                    <li><a href="/article/1884148684942274560.htm"
                           title="深入了解 ELF 文件格式:Linux 的可执行文件标准" target="_blank">深入了解 ELF 文件格式:Linux 的可执行文件标准</a>
                        <span class="text-muted">salsm</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>在Linux操作系统中,ELF(ExecutableandLinkableFormat)文件格式是一个至关重要的标准,它用于存储可执行文件、目标文件和共享库等。无论是开发者、系统管理员,还是从事底层编程的工程师,都需要理解ELF文件的结构,因为它决定了如何加载、执行和调试程序。本文将深入解析ELF文件的结构,帮助大家更好地理解它的工作原理及其在操作系统中的作用。什么是ELF文件?ELF(Execu</div>
                    </li>
                    <li><a href="/article/1884147672923828224.htm"
                           title="IDEA里的Spring Boot的开发环境搭建" target="_blank">IDEA里的Spring Boot的开发环境搭建</a>
                        <span class="text-muted">北城相拥£</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a>
                        <div>SpringBoot的开发环境今天接着介绍SpringBoot的开发环境1.jdk的配置使用IDEA进行开发,在IDEA中配置jdk的方式很简单,打开File->ProjectStructure选择SDKs在JDKhomepath中选择本地jdk的安装目录在Name中为jdk自定义名字通过以上三步骤,即可导入本地安装的jdk。如果是使用STS或者eclipse可以通过两步骤添加:1、window-</div>
                    </li>
                    <li><a href="/article/1884140736115437568.htm"
                           title="mysql数据库 解析树形参数" target="_blank">mysql数据库 解析树形参数</a>
                        <span class="text-muted">fengzelun</span>
<a class="tag" taget="_blank" href="/search/mysql%E7%9B%B8%E5%85%B3/1.htm">mysql相关</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/database/1.htm">database</a>
                        <div>一、前言因为项目数据的地址是树形,格式:440000;440300;440312;659971;查询出的数据又需要转为中文:XXX省XXX市XXX区欢乐港湾东岸L2-016所以需要借助sql存储过程实现二、思路把要读取数据的所有地址编码都查询出来解析地址编码,因为地址编码是分号分隔,所有根据分号循环每个编码解析,解析后再拼接把解析好的地址编码和地址名称存入一张数据表(存的时候利用唯一索引去重)业务</div>
                    </li>
                    <li><a href="/article/1884140739022090240.htm"
                           title="Nacos3# 服务注册与发现服务端启动源码解析" target="_blank">Nacos3# 服务注册与发现服务端启动源码解析</a>
                        <span class="text-muted">瓜农老梁</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/rpc/1.htm">rpc</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/protobuf/1.htm">protobuf</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                        <div>引言本文从gRPC的.proto文件解读其暴露的服务,由此生成gRPC的客户端/服务端存根。进而分析服务端加载启动过程。最近家里事情较多,本文短了点,大伙随便看看。一、内容提要gRPCService.proto解读暴露用于服务端到客户端流式RPC的服务RequestStream#requestStream暴露用于简单RPC调用的服务Request#request暴露用于双向流式RPC调用的服务Bi</div>
                    </li>
                    <li><a href="/article/1884137083916840960.htm"
                           title="深入解析字符编码与数据格式:技术演进与应用实践" target="_blank">深入解析字符编码与数据格式:技术演进与应用实践</a>
                        <span class="text-muted">我的青春不太冷</span>
<a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>文章目录深入解析字符编码与数据格式:技术演进与应用实践字符编码:数字世界的文字基石ASCII:计算机的"字母启蒙"扩展ASCII:地域化解决方案ISO-8859系列Windows-1252中文编码:东方字符的数字化之路GB2312(1980)GBK(1995)GB18030(2000)Unicode:全球化的终极方案UTF-8(1993)UTF-16UTF-32数据编码格式:信息交换的艺术JSON</div>
                    </li>
                    <li><a href="/article/1884127631100669952.htm"
                           title="kuberay 安装和使用" target="_blank">kuberay 安装和使用</a>
                        <span class="text-muted">CHEN_RUI_2200</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>KubeRay是一个基于Kubernetes的项目,旨在简化在Kubernetes上部署和管理Ray集群的过程。先贴点正确的废话:1.简化集群管理KubeRay提供了一个易于使用的界面和工具,允许用户快速创建、配置和管理Ray集群,而不需要深入了解底层Kubernetes的细节。2.自动化部署通过使用Kubernetes的自定义资源定义(CRD),用户可以通过简单的YAML配置文件来定义Ray集群</div>
                    </li>
                    <li><a href="/article/1884125614634496000.htm"
                           title="Python常用库 - logging日志库" target="_blank">Python常用库 - logging日志库</a>
                        <span class="text-muted">小菠萝测试笔记</span>

                        <div>logging的简单介绍用作记录日志,默认分为六种日志级别(括号为级别对应的数值)NOTSET(0)DEBUG(10)INFO(20)WARNING(30)ERROR(40)CRITICAL(50)special在自定义日志级别时注意不要和默认的日志级别数值相同logging执行时输出大于等于设置的日志级别的日志信息,如设置日志级别是INFO,则INFO、WARNING、ERROR、CRITICA</div>
                    </li>
                    <li><a href="/article/1884114777299546112.htm"
                           title="启动了容器 但是 docker ps 不显示任何容器信息" target="_blank">启动了容器 但是 docker ps 不显示任何容器信息</a>
                        <span class="text-muted">杨过姑父</span>
<a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>1.镜像存再[root@localhost~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEhello-worldlatest9c7a54a9a43c6monthsago13.3kB2.启动显示成功[root@localhost~]#dockerrunhello-worldHellofromDocker!Thismessageshowsthatyourin</div>
                    </li>
                                <li><a href="/article/54.htm"
                                       title="JAVA中的Enum" target="_blank">JAVA中的Enum</a>
                                    <span class="text-muted">周凡杨</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/%E6%9E%9A%E4%B8%BE/1.htm">枚举</a>
                                    <div>Enum是计算机编程语言中的一种数据类型---枚举类型。 在实际问题中,有些变量的取值被限定在一个有限的范围内。       例如,一个星期内只有七天 我们通常这样实现上面的定义: 
public String monday;
public String tuesday;
public String wensday;
public String thursday</div>
                                </li>
                                <li><a href="/article/181.htm"
                                       title="赶集网mysql开发36条军规" target="_blank">赶集网mysql开发36条军规</a>
                                    <span class="text-muted">Bill_chen</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E4%B8%9A%E5%8A%A1%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/1.htm">业务架构设计</a><a class="tag" taget="_blank" href="/search/mysql%E8%B0%83%E4%BC%98/1.htm">mysql调优</a><a class="tag" taget="_blank" href="/search/mysql%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">mysql性能优化</a>
                                    <div>(一)核心军规   (1)不在数据库做运算      cpu计算务必移至业务层;   (2)控制单表数据量      int型不超过1000w,含char则不超过500w;      合理分表;      限制单库表数量在300以内;   (3)控制列数量      字段少而精,字段数建议在20以内</div>
                                </li>
                                <li><a href="/article/308.htm"
                                       title="Shell test命令" target="_blank">Shell test命令</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E7%AC%A6%E4%B8%B2/1.htm">字符串</a><a class="tag" taget="_blank" href="/search/test/1.htm">test</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%97/1.htm">数字</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E6%AF%94%E8%BE%83/1.htm">文件比较</a>
                                    <div>Shell test命令 
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。  数值测试    参数 说明   -eq 等于则为真   -ne 不等于则为真   -gt 大于则为真   -ge 大于等于则为真   -lt 小于则为真   -le 小于等于则为真    
实例演示: 
num1=100
num2=100if test $[num1]</div>
                                </li>
                                <li><a href="/article/435.htm"
                                       title="XFire框架实现WebService(二)" target="_blank">XFire框架实现WebService(二)</a>
                                    <span class="text-muted">周凡杨</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/webservice/1.htm">webservice</a>
                                    <div>   有了XFire框架实现WebService(一),就可以继续开发WebService的简单应用。 
Webservice的服务端(WEB工程): 
两个java bean类: 
Course.java 
   package cn.com.bean; 
public class Course { 
    private </div>
                                </li>
                                <li><a href="/article/562.htm"
                                       title="重绘之画图板" target="_blank">重绘之画图板</a>
                                    <span class="text-muted">朱辉辉33</span>
<a class="tag" taget="_blank" href="/search/%E7%94%BB%E5%9B%BE%E6%9D%BF/1.htm">画图板</a>
                                    <div>       上次博客讲的五子棋重绘比较简单,因为只要在重写系统重绘方法paint()时加入棋盘和棋子的绘制。这次我想说说画图板的重绘。 
       画图板重绘难在需要重绘的类型很多,比如说里面有矩形,园,直线之类的,所以我们要想办法将里面的图形加入一个队列中,这样在重绘时就</div>
                                </li>
                                <li><a href="/article/689.htm"
                                       title="Java的IO流" target="_blank">Java的IO流</a>
                                    <span class="text-muted">西蜀石兰</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>刚学Java的IO流时,被各种inputStream流弄的很迷糊,看老罗视频时说想象成插在文件上的一根管道,当初听时觉得自己很明白,可到自己用时,有不知道怎么代码了。。。 
每当遇到这种问题时,我习惯性的从头开始理逻辑,会问自己一些很简单的问题,把这些简单的问题想明白了,再看代码时才不会迷糊。 
 
IO流作用是什么? 
答:实现对文件的读写,这里的文件是广义的; 
 
Java如何实现程序到文件</div>
                                </li>
                                <li><a href="/article/816.htm"
                                       title="No matching PlatformTransactionManager bean found for qualifier 'add' - neither" target="_blank">No matching PlatformTransactionManager bean found for qualifier 'add' - neither</a>
                                    <span class="text-muted">林鹤霄</span>

                                    <div>java.lang.IllegalStateException: No matching PlatformTransactionManager bean found for qualifier 'add' - neither qualifier match nor bean name match! 
  
网上找了好多的资料没能解决,后来发现:项目中使用的是xml配置的方式配置事务,但是</div>
                                </li>
                                <li><a href="/article/943.htm"
                                       title="Row size too large (> 8126). Changing some columns to TEXT or BLOB" target="_blank">Row size too large (> 8126). Changing some columns to TEXT or BLOB</a>
                                    <span class="text-muted">aigo</span>
<a class="tag" taget="_blank" href="/search/column/1.htm">column</a>
                                    <div>原文:http://stackoverflow.com/questions/15585602/change-limit-for-mysql-row-size-too-large 
  
异常信息: 
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAM</div>
                                </li>
                                <li><a href="/article/1070.htm"
                                       title="JS 格式化时间" target="_blank">JS 格式化时间</a>
                                    <span class="text-muted">alxw4616</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>/**
 * 格式化时间 2013/6/13 by 半仙 alxw4616@msn.com
 * 需要 pad 函数
 * 接收可用的时间值.
 * 返回替换时间占位符后的字符串
 *
 * 时间占位符:年 Y 月 M 日 D 小时 h 分 m 秒 s 重复次数表示占位数
 * 如 YYYY 4占4位 YY 占2位<p></p>
 * MM DD hh mm</div>
                                </li>
                                <li><a href="/article/1197.htm"
                                       title="队列中数据的移除问题" target="_blank">队列中数据的移除问题</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/%E9%98%9F%E5%88%97%E7%A7%BB%E9%99%A4/1.htm">队列移除</a>
                                    <div>  
   队列的移除一般都是使用的remov();都可以移除的,但是在昨天做线程移除的时候出现了点问题,没有将遍历出来的全部移除,  代码如下; 
  
   // 
package com.Thread0715.com;

import java.util.ArrayList;

public class Threa</div>
                                </li>
                                <li><a href="/article/1324.htm"
                                       title="Runnable接口使用实例" target="_blank">Runnable接口使用实例</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/Runnable/1.htm">Runnable</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a>
                                    <div>Runnable接口 
a.       该接口只有一个方法:public void run(); 
b.       实现该接口的类必须覆盖该run方法 
c.       实现了Runnable接口的类并不具有任何天</div>
                                </li>
                                <li><a href="/article/1451.htm"
                                       title="oracle里的extend详解" target="_blank">oracle里的extend详解</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/extend/1.htm">extend</a>
                                    <div>扩展已知的数组空间,例: 
DECLARE
  TYPE CourseList IS TABLE OF VARCHAR2(10);
  courses CourseList;
BEGIN
  --   初始化数组元素,大小为3
  courses := CourseList('Biol   4412 ', 'Psyc   3112 ', 'Anth   3001 ');
  --   </div>
                                </li>
                                <li><a href="/article/1578.htm"
                                       title="【httpclient】httpclient发送表单POST请求" target="_blank">【httpclient】httpclient发送表单POST请求</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/httpclient/1.htm">httpclient</a>
                                    <div>浏览器Form Post请求 
浏览器可以通过提交表单的方式向服务器发起POST请求,这种形式的POST请求不同于一般的POST请求 
1. 一般的POST请求,将请求数据放置于请求体中,服务器端以二进制流的方式读取数据,HttpServletRequest.getInputStream()。这种方式的请求可以处理任意数据形式的POST请求,比如请求数据是字符串或者是二进制数据 
2. Form </div>
                                </li>
                                <li><a href="/article/1705.htm"
                                       title="【Hive十三】Hive读写Avro格式的数据" target="_blank">【Hive十三】Hive读写Avro格式的数据</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a>
                                    <div> 1. 原始数据 
hive> select * from word; 
OK
1	MSN  
10	QQ  
100	Gtalk  
1000	Skype  
  
  
 2. 创建avro格式的数据表 
  
hive> CREATE TABLE avro_table(age INT, name STRING)STORE</div>
                                </li>
                                <li><a href="/article/1832.htm"
                                       title="nginx+lua+redis自动识别封解禁频繁访问IP" target="_blank">nginx+lua+redis自动识别封解禁频繁访问IP</a>
                                    <span class="text-muted">ronin47</span>

                                    <div>在站点遇到攻击且无明显攻击特征,造成站点访问慢,nginx不断返回502等错误时,可利用nginx+lua+redis实现在指定的时间段 内,若单IP的请求量达到指定的数量后对该IP进行封禁,nginx返回403禁止访问。利用redis的expire命令设置封禁IP的过期时间达到在 指定的封禁时间后实行自动解封的目的。 
一、安装环境: 
 
 CentOS x64 release 6.4(Fin</div>
                                </li>
                                <li><a href="/article/1959.htm"
                                       title="java-二叉树的遍历-先序、中序、后序(递归和非递归)、层次遍历" target="_blank">java-二叉树的遍历-先序、中序、后序(递归和非递归)、层次遍历</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;


public class BinTreeTraverse {
	//private int[] array={ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	private int[] array={ 10,6,</div>
                                </li>
                                <li><a href="/article/2086.htm"
                                       title="Spring源码学习-XML 配置方式的IoC容器启动过程分析" target="_blank">Spring源码学习-XML 配置方式的IoC容器启动过程分析</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/IOC/1.htm">IOC</a>
                                    <div>以FileSystemXmlApplicationContext为例,把Spring IoC容器的初始化流程走一遍: 
 

ApplicationContext context = new FileSystemXmlApplicationContext
            ("C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml&q</div>
                                </li>
                                <li><a href="/article/2213.htm"
                                       title="[科研与项目]民营企业请慎重参与军事科技工程" target="_blank">[科研与项目]民营企业请慎重参与军事科技工程</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A/1.htm">企业</a>
                                    <div> 
 
     军事科研工程和项目 并非要用最先进,最时髦的技术,而是要做到“万无一失” 
 
   而民营科技企业在搞科技创新工程的时候,往往考虑的是技术的先进性,而对先进技术带来的风险考虑得不够,在今天提倡军民融合发展的大环境下,这种“万无一失”和“时髦性”的矛盾会日益凸显。。。。。。所以请大家在参与任何重大的军事和政府项目之前,对</div>
                                </li>
                                <li><a href="/article/2340.htm"
                                       title="spring 定时器-两种方式" target="_blank">spring 定时器-两种方式</a>
                                    <span class="text-muted">cuityang</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E6%97%B6%E5%99%A8/1.htm">定时器</a>
                                    <div>方式一: 
间隔一定时间 运行 
 
<bean id="updateSessionIdTask" class="com.yang.iprms.common.UpdateSessionTask" autowire="byName" /> 
 
 <bean id="updateSessionIdSchedule</div>
                                </li>
                                <li><a href="/article/2467.htm"
                                       title="简述一下关于BroadView站点的相关设计" target="_blank">简述一下关于BroadView站点的相关设计</a>
                                    <span class="text-muted">damoqiongqiu</span>
<a class="tag" taget="_blank" href="/search/view/1.htm">view</a>
                                    <div>终于弄上线了,累趴,戳这里http://www.broadview.com.cn 
  
简述一下相关的技术点 
  
前端:jQuery+BootStrap3.2+HandleBars,全站Ajax(貌似对SEO的影响很大啊!怎么破?),用Grunt对全部JS做了压缩处理,对部分JS和CSS做了合并(模块间存在很多依赖,全部合并比较繁琐,待完善)。 
  
后端:U</div>
                                </li>
                                <li><a href="/article/2594.htm"
                                       title="运维 PHP问题汇总" target="_blank">运维 PHP问题汇总</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/windows2003/1.htm">windows2003</a>
                                    <div>1、Dede(织梦)发表文章时,内容自动添加关键字显示空白页 
解决方法: 
后台>系统>系统基本参数>核心设置>关键字替换(是/否),这里选择“是”。 
后台>系统>系统基本参数>其他选项>自动提取关键字,这里选择“是”。 
  
2、解决PHP168超级管理员上传图片提示你的空间不足 
网站是用PHP168做的,反映使用管理员在后台无法</div>
                                </li>
                                <li><a href="/article/2721.htm"
                                       title="mac 下 安装php扩展 - mcrypt" target="_blank">mac 下 安装php扩展 - mcrypt</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a>
                                    <div>MCrypt是一个功能强大的加密算法扩展库,它包括有22种算法,phpMyAdmin依赖这个PHP扩展,具体如下: 
 
  
  下载并解压libmcrypt-2.5.8.tar.gz。 
  在终端执行如下命令:  tar zxvf libmcrypt-2.5.8.tar.gz cd libmcrypt-2.5.8/ ./configure --disable-posix-threads --</div>
                                </li>
                                <li><a href="/article/2848.htm"
                                       title="MongoDB更新文档 [四]" target="_blank">MongoDB更新文档 [四]</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/Mongodb%E6%9B%B4%E6%96%B0%E6%96%87%E6%A1%A3/1.htm">Mongodb更新文档</a>
                                    <div>MongoDB更新文档 
转载请出自出处:http://eksliang.iteye.com/blog/2174104 
MongoDB对文档的CURD,前面的博客简单介绍了,但是对文档更新篇幅比较大,所以这里单独拿出来。 
语法结构如下: 
db.collection.update( criteria, objNew, upsert, multi) 
参数含义    参数   </div>
                                </li>
                                <li><a href="/article/2975.htm"
                                       title="Linux下的解压,移除,复制,查看tomcat命令" target="_blank">Linux下的解压,移除,复制,查看tomcat命令</a>
                                    <span class="text-muted">y806839048</span>
<a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a>
                                    <div>重复myeclipse生成webservice有问题删除以前的,干净 
 
 1、先切换到:cd usr/local/tomcat5/logs 
 
2、tail -f catalina.out 
 
3、这样运行时就可以实时查看运行日志了 
 
 
 
 
Ctrl+c 是退出tail命令。 
 有问题不明的先注掉 
   cp /opt/tomcat-6.0.44/webapps/g</div>
                                </li>
                                <li><a href="/article/3102.htm"
                                       title="Spring之使用事务缘由(3-XML实现)" target="_blank">Spring之使用事务缘由(3-XML实现)</a>
                                    <span class="text-muted">ihuning</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>  
用事务通知声明式地管理事务 
  
事务管理是一种横切关注点。为了在 Spring 2.x 中启用声明式事务管理,可以通过 tx Schema 中定义的 <tx:advice> 元素声明事务通知,为此必须事先将这个 Schema 定义添加到 <beans> 根元素中去。声明了事务通知后,就需要将它与切入点关联起来。由于事务通知是在 <aop:</div>
                                </li>
                                <li><a href="/article/3229.htm"
                                       title="GCD使用经验与技巧浅谈" target="_blank">GCD使用经验与技巧浅谈</a>
                                    <span class="text-muted">啸笑天</span>
<a class="tag" taget="_blank" href="/search/GC/1.htm">GC</a>
                                    <div>前言 
GCD(Grand Central Dispatch)可以说是Mac、iOS开发中的一大“利器”,本文就总结一些有关使用GCD的经验与技巧。 
dispatch_once_t必须是全局或static变量 
这一条算是“老生常谈”了,但我认为还是有必要强调一次,毕竟非全局或非static的dispatch_once_t变量在使用时会导致非常不好排查的bug,正确的如下:        1  </div>
                                </li>
                                <li><a href="/article/3356.htm"
                                       title="linux(Ubuntu)下常用命令备忘录1" target="_blank">linux(Ubuntu)下常用命令备忘录1</a>
                                    <span class="text-muted">macroli</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a>
                                    <div>在使用下面的命令是可以通过--help来获取更多的信息1,查询当前目录文件列表:ls 
 
 ls命令默认状态下将按首字母升序列出你当前文件夹下面的所有内容,但这样直接运行所得到的信息也是比较少的,通常它可以结合以下这些参数运行以查询更多的信息:  
 ls / 显示/.下的所有文件和目录  
 ls -l 给出文件或者文件夹的详细信息 
 ls -a 显示所有文件,包括隐藏文</div>
                                </li>
                                <li><a href="/article/3483.htm"
                                       title="nodejs同步操作mysql" target="_blank">nodejs同步操作mysql</a>
                                    <span class="text-muted">qiaolevip</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a>
                                    <div>// db-util.js
var mysql = require('mysql');
var pool = mysql.createPool({
  connectionLimit : 10,
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'test',
  port: 3306
});

</div>
                                </li>
                                <li><a href="/article/3610.htm"
                                       title="一起学Hive系列文章" target="_blank">一起学Hive系列文章</a>
                                    <span class="text-muted">superlxw1234</span>
<a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/Hive%E5%85%A5%E9%97%A8/1.htm">Hive入门</a>
                                    <div>  
[一起学Hive]系列文章 目录贴,入门Hive,持续更新中。 
  
[一起学Hive]之一—Hive概述,Hive是什么 
[一起学Hive]之二—Hive函数大全-完整版 
[一起学Hive]之三—Hive中的数据库(Database)和表(Table) 
[一起学Hive]之四-Hive的安装配置 
[一起学Hive]之五-Hive的视图和分区 
[一起学Hive</div>
                                </li>
                                <li><a href="/article/3737.htm"
                                       title="Spring开发利器:Spring Tool Suite 3.7.0 发布" target="_blank">Spring开发利器:Spring Tool Suite 3.7.0 发布</a>
                                    <span class="text-muted">wiselyman</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>Spring Tool Suite(简称STS)是基于Eclipse,专门针对Spring开发者提供大量的便捷功能的优秀开发工具。 
  
在3.7.0版本主要做了如下的更新: 
  
 
 将eclipse版本更新至Eclipse Mars 4.5 GA 
 Spring Boot(JavaEE开发的颠覆者集大成者,推荐大家学习)的配置语言YAML编辑器的支持(包含自动提示,</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>