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/1835513424734416896.htm"
                           title="UI学习——cell的复用和自定义cell" target="_blank">UI学习——cell的复用和自定义cell</a>
                        <span class="text-muted">Magnetic_h</span>
<a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                        <div>目录cell的复用手动(非注册)自动(注册)自定义cellcell的复用在iOS开发中,单元格复用是一种提高表格(UITableView)和集合视图(UICollectionView)滚动性能的技术。当一个UITableViewCell或UICollectionViewCell首次需要显示时,如果没有可复用的单元格,则视图会创建一个新的单元格。一旦这个单元格滚动出屏幕,它就不会被销毁。相反,它被添</div>
                    </li>
                    <li><a href="/article/1835511030260789248.htm"
                           title="c++ 的iostream 和 c++的stdio的区别和联系" target="_blank">c++ 的iostream 和 c++的stdio的区别和联系</a>
                        <span class="text-muted">黄卷青灯77</span>
<a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</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/iostream/1.htm">iostream</a><a class="tag" taget="_blank" href="/search/stdio/1.htm">stdio</a>
                        <div>在C++中,iostream和C语言的stdio.h都是用于处理输入输出的库,但它们在设计、用法和功能上有许多不同。以下是两者的区别和联系:区别1.编程风格iostream(C++风格):C++标准库中的输入输出流类库,支持面向对象的输入输出操作。典型用法是cin(输入)和cout(输出),使用>操作符来处理数据。更加类型安全,支持用户自定义类型的输入输出。#includeintmain(){in</div>
                    </li>
                    <li><a href="/article/1835504217729626112.htm"
                           title="Python教程:一文了解使用Python处理XPath" target="_blank">Python教程:一文了解使用Python处理XPath</a>
                        <span class="text-muted">旦莫</span>
<a class="tag" taget="_blank" href="/search/Python%E8%BF%9B%E9%98%B6/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>目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代</div>
                    </li>
                    <li><a href="/article/1835501948011376640.htm"
                           title="使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)" target="_blank">使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)</a>
                        <span class="text-muted">编程经验分享</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/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/ssh/1.htm">ssh</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>目录前言基本使用教程新建远程连接连接主机自定义命令路由追踪前言后端开发,必然需要和服务器打交道,部署应用,排查问题,查看运行日志等等。一般服务器都是集中部署在机房中,也有一些直接是云服务器,总而言之,程序员不可能直接和服务器直接操作,一般都是通过ssh连接来登录服务器。刚接触远程连接时,使用的是XSHELL来远程连接服务器,连接上就能够操作远程服务器了,但是仅用XSHELL并没有上传下载文件的功能</div>
                    </li>
                    <li><a href="/article/1835495517774245888.htm"
                           title="python八股文面试题分享及解析(1)" target="_blank">python八股文面试题分享及解析(1)</a>
                        <span class="text-muted">Shawn________</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>#1.'''a=1b=2不用中间变量交换a和b'''#1.a=1b=2a,b=b,aprint(a)print(b)结果:21#2.ll=[]foriinrange(3):ll.append({'num':i})print(11)结果:#[{'num':0},{'num':1},{'num':2}]#3.kk=[]a={'num':0}foriinrange(3):#0,12#可变类型,不仅仅改变</div>
                    </li>
                    <li><a href="/article/1835494258262503424.htm"
                           title="【JS】执行时长(100分) |思路参考+代码解析(C++)" target="_blank">【JS】执行时长(100分) |思路参考+代码解析(C++)</a>
                        <span class="text-muted">l939035548</span>
<a class="tag" taget="_blank" href="/search/JS/1.htm">JS</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>题目为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成。题目输入第一个参数为GPU一次最多执行的任务个数,取值范围[1,10000]第二个参数为任务数组长度,取值范围[1,10000]第三个参数为任务数组,数字范围</div>
                    </li>
                    <li><a href="/article/1835491859351302144.htm"
                           title="Python 实现图片裁剪(附代码) | Python工具" target="_blank">Python 实现图片裁剪(附代码) | Python工具</a>
                        <span class="text-muted">剑客阿良_ALiang</span>

                        <div>前言本文提供将图片按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考我的另一篇文章:windowsffmpeg安装部署_阿良的博客-CSDN博客本文主要使用到的不是ffmpeg,而是ffprobe也在上面这篇文章中的zip包中。ffmpy安装:pipinstallffmpy-ihttps://pypi.douban.com/simple代码不废话了,上代码</div>
                    </li>
                    <li><a href="/article/1835491353451130880.htm"
                           title="【华为OD技术面试真题 - 技术面】- python八股文真题题库(4)" target="_blank">【华为OD技术面试真题 - 技术面】- python八股文真题题库(4)</a>
                        <span class="text-muted">算法大师</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BAod/1.htm">华为od</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选**1.Python中的`with`**用途和功能自动资源管理示例:文件操作上下文管理协议示例代码工作流程解析优点2.\_\_new\_\_和**\_\_init\_\_**区别__new____init__区别总结3.**切片(Slicing)操作**基本切片语法</div>
                    </li>
                    <li><a href="/article/1835490471032483840.htm"
                           title="高级 ECharts 技巧:自定义图表主题与样式" target="_blank">高级 ECharts 技巧:自定义图表主题与样式</a>
                        <span class="text-muted">SnowMan1993</span>
<a class="tag" taget="_blank" href="/search/echarts/1.htm">echarts</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a>
                        <div>ECharts是一个强大的数据可视化库,提供了多种内置主题和样式,但你也可以根据项目的设计需求,自定义图表的主题与样式。本文将介绍如何使用ECharts自定义图表主题,以提升数据可视化的吸引力和一致性。1.什么是ECharts主题?ECharts的主题是指定义图表样式的配置项,包括颜色、字体、线条样式等。通过预设主题,你可以快速更改图表的整体风格,而自定义主题则允许你在此基础上进行个性化设置。2.</div>
                    </li>
                    <li><a href="/article/1835490218845761536.htm"
                           title="Python爬虫解析工具之xpath使用详解" target="_blank">Python爬虫解析工具之xpath使用详解</a>
                        <span class="text-muted">eqa11</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门</div>
                    </li>
                    <li><a href="/article/1835484420023349248.htm"
                           title="18、架构-可观测性之聚合度量" target="_blank">18、架构-可观测性之聚合度量</a>
                        <span class="text-muted">大树~~</span>
<a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                        <div>聚合度量聚合度量是指对系统运行时产生的各种指标数据进行收集、聚合和分析,以了解系统的健康状况和性能表现。聚合度量是可观测性的关键组成部分,通过对度量数据的分析,可以及时发现系统中的异常和瓶颈。以下是对聚合度量各个方面的详细解析,并结合具体的数据案例和技术支撑。指标收集收集系统运行时产生的各种指标数据是聚合度量的基础。常见的指标包括CPU使用率、内存使用率、请求处理时间、请求数、错误率等。以下是指标</div>
                    </li>
                    <li><a href="/article/1835481396408315904.htm"
                           title="如何选择最适合你的项目研发管理软件?TAPD卓越版全面解析" target="_blank">如何选择最适合你的项目研发管理软件?TAPD卓越版全面解析</a>
                        <span class="text-muted">北京云巴巴信息技术有限公司</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86/1.htm">产品经理</a><a class="tag" taget="_blank" href="/search/%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90/1.htm">需求分析</a>
                        <div>在当今快速发展的科技时代,项目研发管理软件已成为企业不可或缺的重要工具。面对市场上琳琅满目的产品,如何选择一款适合自己团队的项目研发管理软件呢?本文将围绕项目研发管理软件的选择标准,重点介绍TAPD卓越版的特点、优势以及使用体验,让你更好地理解和选择适合自己的项目研发管理软件。项目研发管理软件的选择标准在选择项目研发管理软件时,我们需要考虑以下几个方面的因素:功能全面性:软件是否覆盖了从需求管理、</div>
                    </li>
                    <li><a href="/article/1835480289204334592.htm"
                           title="剧本杀《鲸鱼马戏团》剧本杀剧透+真相答案复盘解析攻略" target="_blank">剧本杀《鲸鱼马戏团》剧本杀剧透+真相答案复盘解析攻略</a>
                        <span class="text-muted">VX搜_奶茶剧本杀</span>

                        <div>本文为剧本杀《鲸鱼马戏团》剧本杀测评+部分真相复盘,获取完整真相复盘只需两步:①、关注微信公众号【奶茶剧本杀】→②、回复剧本杀《鲸鱼马戏团》即可获取查看剧本杀《鲸鱼马戏团》剧本杀真相答案复盘+凶手剧透:以下是玩家评测+部分关键证据,凶手,时间线,复盘解析,推理逻辑--------------------------------------------------------------------</div>
                    </li>
                    <li><a href="/article/1835478496810463232.htm"
                           title="Xinference如何注册自定义模型" target="_blank">Xinference如何注册自定义模型</a>
                        <span class="text-muted">玩人工智能的辣条哥</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/Xinference/1.htm">Xinference</a>
                        <div>环境:Xinference问题描述:Xinference如何注册自定义模型解决方案:1.写个model_config.json,内容如下{"version":1,"context_length":2048,"model_name":"custom-llama-3","model_lang":["en","ch"],"model_ability":["generate","chat"],"model</div>
                    </li>
                    <li><a href="/article/1835463622344667136.htm"
                           title="基于Python给出的PDF文档转Markdown文档的方法" target="_blank">基于Python给出的PDF文档转Markdown文档的方法</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/pdf/1.htm">pdf</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>注:网上有很多将Markdown文档转为PDF文档的方法,但是却很少有将PDF文档转为Markdown文档的方法。就算有,比如某些网站声称可以将PDF文档转为Markdown文档,尝试过,不太符合自己的要求,而且无法保证文档没有泄露风险。于是本人为了解决这个问题,借助GPT(能使用GPT镜像或者有条件直接使用GPT的,反正能调用GPT接口就行)生成Python代码来完成这个功能。笔记、代码难免存在</div>
                    </li>
                    <li><a href="/article/1835457442260021248.htm"
                           title="ArrayList 源码解析" target="_blank">ArrayList 源码解析</a>
                        <span class="text-muted">程序猿进阶</span>
<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/ArrayList/1.htm">ArrayList</a><a class="tag" taget="_blank" href="/search/List/1.htm">List</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/1.htm">架构设计</a><a class="tag" taget="_blank" href="/search/idea/1.htm">idea</a>
                        <div>ArrayList是Java集合框架中的一个动态数组实现,提供了可变大小的数组功能。它继承自AbstractList并实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量capacity,表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添</div>
                    </li>
                    <li><a href="/article/1835456308095053824.htm"
                           title="Kafka是如何保证数据的安全性、可靠性和分区的" target="_blank">Kafka是如何保证数据的安全性、可靠性和分区的</a>
                        <span class="text-muted">喜欢猪猪</span>
<a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                        <div>Kafka作为一个高性能、可扩展的分布式流处理平台,通过多种机制来确保数据的安全性、可靠性和分区的有效管理。以下是关于Kafka如何保证数据安全性、可靠性和分区的详细解析:一、数据安全性SSL/TLS加密:Kafka支持SSL/TLS协议,通过配置SSL证书和密钥来加密数据传输,确保数据在传输过程中不会被窃取或篡改。这一机制有效防止了中间人攻击,保护了数据的安全性。SASL认证:Kafka支持多种</div>
                    </li>
                    <li><a href="/article/1835454921990828032.htm"
                           title="Java爬虫框架(一)--架构设计" target="_blank">Java爬虫框架(一)--架构设计</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/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BB%BB%E5%8A%A1/1.htm">任务</a><a class="tag" taget="_blank" href="/search/html%E8%A7%A3%E6%9E%90%E5%99%A8/1.htm">html解析器</a><a class="tag" taget="_blank" href="/search/%E5%AD%98%E5%82%A8/1.htm">存储</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%AD%90%E5%95%86%E5%8A%A1/1.htm">电子商务</a>
                        <div>一、架构图那里搜网络爬虫框架主要针对电子商务网站进行数据爬取,分析,存储,索引。爬虫:爬虫负责爬取,解析,处理电子商务网站的网页的内容数据库:存储商品信息索引:商品的全文搜索索引Task队列:需要爬取的网页列表Visited表:已经爬取过的网页列表爬虫监控平台:web平台可以启动,停止爬虫,管理爬虫,task队列,visited表。二、爬虫1.流程1)Scheduler启动爬虫器,TaskMast</div>
                    </li>
                    <li><a href="/article/1835448366310453248.htm"
                           title="光盘文件系统 (iso9660) 格式解析" target="_blank">光盘文件系统 (iso9660) 格式解析</a>
                        <span class="text-muted">穷人小水滴</span>
<a class="tag" taget="_blank" href="/search/%E5%85%89%E7%9B%98/1.htm">光盘</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/1.htm">文件系统</a><a class="tag" taget="_blank" href="/search/iso9660/1.htm">iso9660</a><a class="tag" taget="_blank" href="/search/deno/1.htm">deno</a><a class="tag" taget="_blank" href="/search/GNU%2FLinux/1.htm">GNU/Linux</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>越简单的系统,越可靠,越不容易出问题.光盘文件系统(iso9660)十分简单,只需不到200行代码,即可实现定位读取其中的文件.参考资料:https://wiki.osdev.org/ISO_9660相关文章:《光盘防水嘛?DVD+R刻录光盘泡水实验》https://blog.csdn.net/secext2022/article/details/140583910《光驱的内部结构及日常使用》ht</div>
                    </li>
                    <li><a href="/article/1835447479580061696.htm"
                           title="uniapp map组件自定义markers标记点" target="_blank">uniapp map组件自定义markers标记点</a>
                        <span class="text-muted">以对_</span>
<a class="tag" taget="_blank" href="/search/uni-app%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/1.htm">uni-app学习记录</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>需求是根据后端返回数据在地图上显示标记点,并且根据数据状态控制标记点颜色,标记点背景通过两张图片实现控制{{item.options.labelName}}exportdefault{data(){return{storeIndex:0,locaInfo:{longitude:120.445172,latitude:36.111387},markers:[//标点列表{id:1,//标记点idin</div>
                    </li>
                    <li><a href="/article/1835444957423431680.htm"
                           title="《 C++ 修炼全景指南:九 》打破编程瓶颈!掌握二叉搜索树的高效实现与技巧" target="_blank">《 C++ 修炼全景指南:九 》打破编程瓶颈!掌握二叉搜索树的高效实现与技巧</a>
                        <span class="text-muted">Lenyiin</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E4%BF%AE%E7%82%BC%E5%85%A8%E6%99%AF%E6%8C%87%E5%8D%97/1.htm">修炼全景指南</a><a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%E6%8C%87%E5%8D%97/1.htm">技术指南</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/stl/1.htm">stl</a>
                        <div>摘要本文详细探讨了二叉搜索树(BinarySearchTree,BST)的核心概念和技术细节,包括插入、查找、删除、遍历等基本操作,并结合实际代码演示了如何实现这些功能。文章深入分析了二叉搜索树的性能优势及其时间复杂度,同时介绍了前驱、后继的查找方法等高级功能。通过自定义实现的二叉搜索树类,读者能够掌握其实际应用,此外,文章还建议进一步扩展为平衡树(如AVL树、红黑树)以优化极端情况下的性能退化。</div>
                    </li>
                    <li><a href="/article/1835443696431099904.htm"
                           title="笋丁网页自动回复机器人V3.0.0免授权版源码" target="_blank">笋丁网页自动回复机器人V3.0.0免授权版源码</a>
                        <span class="text-muted">希希分享</span>
<a class="tag" taget="_blank" href="/search/%E8%BD%AF%E5%B8%8C%E7%BD%9158soho_cn/1.htm">软希网58soho_cn</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E8%B5%84%E6%BA%90/1.htm">源码资源</a><a class="tag" taget="_blank" href="/search/%E7%AC%8B%E4%B8%81%E7%BD%91%E9%A1%B5%E8%87%AA%E5%8A%A8%E5%9B%9E%E5%A4%8D%E6%9C%BA%E5%99%A8%E4%BA%BA/1.htm">笋丁网页自动回复机器人</a>
                        <div>笋丁网页机器人一款可设置自动回复,默认消息,调用自定义api接口的网页机器人。此程序后端语言使用Golang,内存占用最高不超过30MB,1H1G服务器流畅运行。仅支持Linux服务器部署,不支持虚拟主机,请悉知!使用自定义api功能需要有一定的建站基础。源码下载:https://download.csdn.net/download/m0_66047725/89754250更多资源下载:关注我。安</div>
                    </li>
                    <li><a href="/article/1835443569528238080.htm"
                           title="Vue( ElementUI入门、vue-cli安装)" target="_blank">Vue( ElementUI入门、vue-cli安装)</a>
                        <span class="text-muted">m0_l5z</span>
<a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a>
                        <div>一.ElementUI入门目录:1.ElementUI入门1.1ElementUI简介1.2Vue+ElementUI安装1.3开发示例2.搭建nodejs环境2.1nodejs介绍2.2npm是什么2.3nodejs环境搭建2.3.1下载2.3.2解压2.3.3配置环境变量2.3.4配置npm全局模块路径和cache默认安装位置2.3.5修改npm镜像提高下载速度2.3.6验证安装结果3.运行n</div>
                    </li>
                    <li><a href="/article/1835443569968640000.htm"
                           title="Spring MVC 全面指南:从入门到精通的详细解析" target="_blank">Spring MVC 全面指南:从入门到精通的详细解析</a>
                        <span class="text-muted">一杯梅子酱</span>
<a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%E6%A0%88%E5%AD%A6%E4%B9%A0/1.htm">技术栈学习</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>引言:SpringMVC,作为Spring框架的一个重要模块,为构建Web应用提供了强大的功能和灵活性。无论是初学者还是有一定经验的开发者,掌握SpringMVC都将显著提升你的Web开发技能。本文旨在为初学者提供一个全面且易于理解的学习路径,通过详细的知识点分析和实际案例,帮助你快速上手SpringMVC,让学习过程既深刻又高效。一、SpringMVC简介1.1什么是SpringMVC?Spri</div>
                    </li>
                    <li><a href="/article/1835441991391997952.htm"
                           title="崩坏星穹铁道哪个角色值得培养 崩坏星穹铁道新手角色优先级教学" target="_blank">崩坏星穹铁道哪个角色值得培养 崩坏星穹铁道新手角色优先级教学</a>
                        <span class="text-muted">会飞滴鱼儿</span>

                        <div>崩坏星穹铁道新手角色培养攻略:哪些角色值得投资?在《崩坏星穹铁道》中,角色的强度和培养一直是玩家们关心的焦点。要想体验更爽快的游戏过程,选对角色至关重要。那么,哪些角色值得投资培养呢?本篇教学文章将针对新手玩家,从T0到T1强度的角色中为你做出详尽解析。游戏豹官网现在的手游平台很多,但是在游戏界有这么一个传说:“喜欢肝的玩家不如氪金玩家,氪金玩家不如内部福利玩家”,这就是游戏界可悲的生物链,很多平</div>
                    </li>
                    <li><a href="/article/1835438028009598976.htm"
                           title="WebMagic:强大的Java爬虫框架解析与实战" target="_blank">WebMagic:强大的Java爬虫框架解析与实战</a>
                        <span class="text-muted">Aaron_945</span>
<a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>文章目录引言官网链接WebMagic原理概述基础使用1.添加依赖2.编写PageProcessor高级使用1.自定义Pipeline2.分布式抓取优点结论引言在大数据时代,网络爬虫作为数据收集的重要工具,扮演着不可或缺的角色。Java作为一门广泛使用的编程语言,在爬虫开发领域也有其独特的优势。WebMagic是一个开源的Java爬虫框架,它提供了简单灵活的API,支持多线程、分布式抓取,以及丰富的</div>
                    </li>
                    <li><a href="/article/1835435758844997632.htm"
                           title="【2022 CCF 非专业级别软件能力认证第一轮(CSP-J1)入门级 C++语言试题及解析】" target="_blank">【2022 CCF 非专业级别软件能力认证第一轮(CSP-J1)入门级 C++语言试题及解析】</a>
                        <span class="text-muted">汉子萌萌哒</span>
<a class="tag" taget="_blank" href="/search/CCF/1.htm">CCF</a><a class="tag" taget="_blank" href="/search/noi/1.htm">noi</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)1.以下哪种功能没有涉及C++语言的面向对象特性支持:()。A.C++中调用printf函数B.C++中调用用户定义的类成员函数C.C++中构造一个class或structD.C++中构造来源于同一基类的多个派生类题目解析【解析】正确答案:AC++基础知识,面向对象和类有关,类又涉及父类、子类、继承、派生等关系,printf</div>
                    </li>
                    <li><a href="/article/1835430719363575808.htm"
                           title="更改npm镜像源为淘宝镜像" target="_blank">更改npm镜像源为淘宝镜像</a>
                        <span class="text-muted">骆小骆</span>
<a class="tag" taget="_blank" href="/search/%E5%9F%BA%E4%BA%8Enode.js/1.htm">基于node.js</a>
                        <div>npm常用指令后缀*最近复习了一下node.js整理了一下跟node.js相关的指令后缀*--save、-S参数意思是把模块的版本信息保存到dependencies(生产环境依赖)中,即你的package.json文件的dependencies字段中;–--save-dev、-D参数意思是把模块版本信息保存到devDependencies(开发环境依赖)中,即你的package.json文件的de</div>
                    </li>
                    <li><a href="/article/1835424411616899072.htm"
                           title="绝招曝光!3小时高效利用ChatGPT写出精彩论文" target="_blank">绝招曝光!3小时高效利用ChatGPT写出精彩论文</a>
                        <span class="text-muted">kkai人工智能</span>
<a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%AA%92%E4%BD%93/1.htm">媒体</a>
                        <div>在这份指南中,我将深入解析如何利用ChatGPT4.0的高级功能,指导整个学术研究和写作过程。从初步探索研究主题,到撰写结构严谨的学术论文,我将一步步展示如何在每个环节中有效运用ChatGPT。如果您还未使用PLUS版本,可以参考相关教程。**初步探索与主题的确定**起初,我处于庞大的知识领域中,寻找一个可深入研究的领域。ChatGPT如同灯塔,通过深入分析最新研究趋势和领域热点,帮助我在广阔的学</div>
                    </li>
                    <li><a href="/article/1835423399606841344.htm"
                           title="ERP企业资源规划系统" target="_blank">ERP企业资源规划系统</a>
                        <span class="text-muted">点滴~</span>
<a class="tag" taget="_blank" href="/search/%E6%95%99%E8%82%B2%E7%94%B5%E5%95%86/1.htm">教育电商</a>
                        <div>ERP企业资源规划系统ERP(EnterpriseResourcePlanning)企业资源规划系统是一种综合性的管理信息系统,旨在通过信息技术手段实现对企业内部资源的全面规划、管理和控制。以下是对ERP企业资源规划系统的详细解析:一、定义与核心思想ERP系统建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。它不仅仅是一个软件,更重要的是一个管理思想,实现了企</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>