- 工件列表
- 工件类型
- 添加工件
- 部署项目
- exploded 工件的部署
- war 工件的部署
- 手动部署项目
- war 包部署
- exploded 部署
- 部署有关的操作
- deploy/redeploy(部署/重新部署)
- rerun/run(重启服务器/启动服务器)
- Update resources(更新静态资源)
- Update classes and resources(更新字节码文件和静态资源)
- 汇总
注:本文中的 IDE 是 IntelliJ IDEA for Mac。
工件列表部署项目之前,你要先添加有关 Web 工程的工件(Artifact),其实在创建 Java Web Module 的时候 IDEA 会自动添加模块的 Artifact。
注:这个 Web 工程其实是 IDEA Project 中的一个模块(Module)而已。
注意: 以 exploded 工件部署项目后,再把 exploded 工件删除了,再次部署项目时,会将部署用的 xml 配置文件删除,最终部署失败。但是工件输出目录下的部署包存在。
以 war 工件部署项目后,再把 war 工件删除了,再次部署项目时,最终部署失败,但是工件输出目录下的 war文件以及 webapps 下的部署包都存在。
以 war 工件部署项目后,再把 exploded 工件删除了,再次部署项目时,会将工件输出目录下的 war 文件删除,最终部署失败。但是 webapps 目录下的部署包存在。
工件类型war:表示 IDEA 会将项目按 web 服务的目录结构生成一个部署包,然后打成 war 包,存放在指定的输出目录下 war exploded:表示 IDEA 会将项目按 web 服务的目录结构生成一个部署包,直接存放在指定的输出目录下,不会将部署包打成 war 包
添加工件工件是依赖于项目产生的,所以添加工件的时候你需要选择对应的项目模块。而且添加项目工件时,必须先添加 Exploded 类型的工件,才能添加 war 类型的工件。 添加了某个项目的 Exploded 类型的工件后,你才能添加该项目的 Archive 类型的工件:
添加了项目的工件构建方式后,在 tomcat 的 deployment 中就可以选择添加了,如下图所示: 服务器配置中,若 deployment 没有添加任何工件,会显示一个红色 ×。
若你选择的是 exploded 项目工件,IDEA 会根据工件类型来构建工件,也就是构建部署包,构建的部署包会存放在指定输出目录下(/Users/liaowenxiong/Documents/IdeaProjects/java-exercises/out/artifacts
),不会打成 war 包,也不会存放在 tomcat 的 webapps 目录下;
接着会生成一个 xml 配置文件,这个 xml 文件以虚拟目录命名,存放在 IDEA 一个特定的目录下(/Users/liaowenxiong/Library/Caches/JetBrains/IntelliJIdea2020.3/tomcat/0e0b39f5-0ff8-4713-ab72-81b276953084/conf/catalina/localhost
)。在这个文件中配置标签 的 docBase 属性的值,而这个属性值就是部署包的路径。
注意: 1.以 exploded 工件部署的,把工件列表中的 exploded 工件删除了,再次部署时会删除 conf/catalina/localhost
目录下的 xml 文件,导致部署失败。但是删除 war 工件不会影响 exploded 工件的部署。
2.将 tomcat 配置文件下的 deployment 相关部署工件删除,再次部署的时候会删除 conf/catalina/localhost
目录下的 xml 文件,导致部署失败。
如果你选择的是 war 工件,那么 IDEA 会根据 web 服务的目录结构生成部署包,然后打成 war 包,war 包会存放在指定的工件输出目录下;
接着会生成一个 xml 配置文件,这个 xml 文件以虚拟目录命名,存放在 IDEA 一个特定的目录下(/Users/liaowenxiong/Library/Caches/JetBrains/IntelliJIdea2020.3/tomcat/0e0b39f5-0ff8-4713-ab72-81b276953084/conf/catalina/localhost
)。在这个文件中配置标签 的 docBase 属性的值,而这个属性值就是 war 文件的路径。
接着 tomcat 会去解析 xml 文件,发现是 war 文件,则会将 war 包解压到服务器的 webapps 目录下,而且解压后的目录根据 Applicaiton context URL 的名称来命名。部署就完成了。
注意: 1.以 war 工件部署的,把工件列表中的 exploded 工件删除,再次部署时失败,且工件输出目录下的 war 包会被删除,conf/catalina/localhost
下的 xml 文件也会被删除。但是 webapps 目录的部署包依旧存在,我们此时通过命令终端启动服务器后,项目可以照常访问,但是通过 IDEA 启动的 tomcat 要停止掉。
2.以 war 工件部署的,把工件列表中的 war 工件删除,再次部署时失败,conf/catalina/localhost
下的 xml 文件会被删除,但是工件输出目录下的 war 包和 webapps 下的部署包依旧存在,我们此时通过命令终端启动服务器后,项目可以照常访问,但是通过 IDEA 启动的 tomcat 要停止掉。
3.将 tomcat 配置文件下的 deployment 相关部署工件删除,再次部署失败,且会删除 conf/catalina/localhost
目录下的 xml 文件。但是工件输出目录下的 war 文件和 webapps 目录下的部署包依旧存在。但是无法正常访问项目。有趣的是,这个 xml 文件其实和部署 war 工件没有关系,在删除了 xml 文件的情况下,只要确保 webapps 目录下有项目的部署包,我们此时通过命令终端启动服务器后,项目可以照常访问,但是通过 IDEA 启动的 tomcat 要停止掉。
这里的手动部署项目是指不借助 IDEA 等开发工具来启动 tomcat 和部署项目。
war 包部署1.使用工具生成部署包,或者自己根据 web 服务的目录结构生成一份部署包,然后打成 war 包;
2.接着把 war 包放置在某个目录下,通常是放在项目的 /out/artifacts/
目录下或者放在模块根目录下的 target/
目录下;
3.接着你要在 /Users/liaowenxiong/Applications/apache-tomcat-8.5.73/conf/Catalina/localhost
目录下创建一个以虚拟目录命名的 xml 文件,文件中的标签 的属性 docBase 的值设为 war 文件的路径,如下所示:
xml 文件配置好之后,启动 tomcat,tomcat 会自动找到 war 文件,并将其释放到 webapps 目录下。
特别说明: tomcat 有个监听器,这个监听器会定时解析 conf/Catalina/localhost
目录下的 xml 文件,发现 xml 文件中的 的 docBase 属性保存的是 war 文件的路径,就会自动将其释放到 webapps 目录下,如果 webapps 目录下已经存在该目录,则不会释放。
注意: war 这种部署方式,实际上只是通过 xml 文件来告诉 tomcat war 文件的位置,让 tomcat 找到 war 文件,然后将其释放到 webapps 目录下。所以这种部署,真正起作用的是把部署包放置在 tomcat 的webapps 目录下,就已经完成部署了。xml 文件是可以不需要的,war 包也是可以不需要的。
exploded 部署1.使用工具生成部署包,或者自己根据 web 服务的目录结构生成一份部署包; 2.接着把部署包放置在某个目录下,通常是放在项目的 /out/artifacts/
目录下或者放在模块根目录下的 target/
目录下; 3.接着你要在 /Users/liaowenxiong/Applications/apache-tomcat-8.5.73/conf/Catalina/localhost
目录下创建一个以虚拟目录命名的 xml 文件,文件中的标签 的属性 docBase 的值设为部署包的路径,如下所示:
这样就部署完成了,启动服务器就可以正常访问了。
部署有关的操作 deploy/redeploy(部署/重新部署)部署前会先构建项目和构建工件(部署包),如果已经构建过工件,则会检测编译输出目录及webapp目录的文件是否有变动,有的话则会更新部署包相关的文件。没有变动过,则不会更新。
1.如果Java代码修改过,会更新编译输出目录(默认是 target/classes)下的字节码文件,也会更新部署包中的字节码文件 2.开发项目中新增 Java 文件(无论复制新增还是正常新建),会更新编译输出目录下的字节码文件,也会更新部署包中的字节码文件 3.开发项目中删除 Java 文件,会更新编译输出目录下的字节码文件,也会更新部署包中的字节码文件 4.resources 目录下的资源文件新增了,分为两种情况,如果是正常创建的文件会更新到编译输出目录下,也会更新到部署包中的 classes 目录下;如果是复制新增的文件则不会
5.resources 目录下的资源文件删除了,会更新到编译输出目录下的相关文件,也会更新部署包中的 classes 目录下的相关文件
6.resources 目录下的资源文件修改了,会更新到编译输出目录下的相关文件,也会更新部署包中的 classes 目录下的相关文件
7.resources 目录下的子目录删除了,编译输出目录的相关目录也会删除,但是部署包中的 classes 目录下的相关子目录会保留,只是内容清空了
8.webapp 目录下的静态资源文件修改过,会更新部署包中的相关文件 9.webapp 目录下的静态资源文件删除了,会更新部署包中的相关文件 10.webapp 目录下的静态资源文件新增了,分为两种情况,如果是复制新增的文件,则不会更新到部署包中;如果是正常新建的文件则会更新到部署包中
rerun/run(重启服务器/启动服务器)启动服务器后会自动部署项目(前提是已经在 tomcat 的配置文件中的 Deployment 添加部署工件);如果已经部署过则会重新部署项目。启动服务器触发的部署和重新部署,其实和手动触发 deploy/redeploy 效果相同。
1.如果Java代码修改过,会更新编译输出目录(默认是 target/classes)下的字节码文件,也会更新部署包中的字节码文件 2.开发项目中新增 Java 文件(不论是复制新增还是正常新建),会更新编译输出目录下的字节码文件,也会更新部署包中的字节码文件 3.开发项目中删除 Java 文件,会更新编译输出目录下的字节码文件,也会更新部署包中的字节码文件
4.resources 目录下的资源文件新增了,分为两种情况,如果是正常创建的文件会更新到编译输出目录下,也会更新到部署包中的 classes 目录下;如果是复制新增的文件则不会。
另外新增的空目录不会更新到编译输出目录下,也不会更新到部署包中;复制新增的目录,即使目录含有文件,也不会更新到编译输出目录下,也不会更新到部署包中
5.resources 目录下的资源文件删除了,会更新到编译输出目录下的相关文件,也会更新部署包中的 classes 目录下的相关文件
6.resources 目录下的资源文件修改了,会更新到编译输出目录下的相关文件,也会更新部署包中的 classes 目录下的相关文件
7.resources 目录下的子目录删除了,编译输出目录的相关目录也会删除,但是部署包中的 classes 目录下的相关子目录会保留,只是内容清空了
8.webapp 目录下的静态资源文件修改过,会更新部署包中的相关文件 9.webapp 目录下的静态资源文件删除了,会更新部署包中的相关文件 10.webapp 目录下的静态资源文件新增了,分为两种情况,如果是复制新增的文件,则不会更新到部署包中;如果是正常新建的文件则会更新到部署包中
Update resources(更新静态资源)1.Java 文件的修改、新增、删除都不会更新到部署包中(在 run 和 debug 模式下)
2.resources 目录的资源文件新增了,分为两种情况,如果是复制新增的文件,则不会更新到部署包中,也不会更新到编译输出目录下;如果是正常新建的文件则会更新到部署包中,也会更新到编译输出目录下(在 run 和 debug 模式下)
3.resources 目录下的资源文件删除了,不会更新部署包中的相关文件;但是会更新编译输出目录下的相关文件(在 run 和 debug 模式下)
4.resources 目录下的资源文件修改了,会更新部署包中的相关文件;也会更新编译输出目录下的相关文件(在 run 和 debug 模式下)
5.webapp 目录下的静态资源文件修改了,会更新部署包中的相关文件(在 run 和 debug 模式下) 6.webapp 目录下的静态资源文件删除了,不会更新部署包中的相关文件(在 run 和 debug 模式下) 7.webapp 目录下的静态资源文件新增了,分为两种情况,如果是复制新增的文件,则不会更新到部署包中;如果是正常新建的文件则会更新到部署包中(在 run 和 debug 模式下)
Update classes and resources(更新字节码文件和静态资源)1.Java 文件的修改,在 run 模式或者 debug 模式下会更新编译输出目录下的相关字节码文件;也会更新部署包中的相关字节码文件。但是在run模式下,只是更新了部署包中的字节码文件而已,如果这个类已经加载进入内存中了,内存中的 Class 对象还是旧的,所以执行的代码并没有更新。但是在 debug 模式下,不仅会更新部署包中的相关字节码文件,还会更新内存中的 Class 对象,所以执行的是最新的代码。
2.Java 文件的新增(正常新建或者复制新增),在 run 模式或者 debug 模式下会更新到编译输出目录下;也会更新到部署包中
3.Java 文件的删除,在 run 模式或者 debug 模式下会更新编译输出目录下的相关字节码文件;也会更新部署包中的相关字节码文件。但是在 run 模式下只是把部署包中的相关字节码文件删除了,但是已经加载入内存的类对应的 Class 对象并没有被释放,依旧在内存中,所以你依旧可以照常访问相关的资源;而在 debug 模式下,则会把已经加载入内存的类所对应的 Class 对象释放掉,你无法再访问有关的资源。
4.resources 目录的资源文件新增了,分为两种情况,如果是复制新增的文件,在 run 模式或 debug 模式下都不会更新到部署包中,也不会更新到编译输出目录中;如果是正常新建的文件,在 run 模式或 debug 模式下都会更新到部署包中,也会更新到编译输出目录中
5.resources 目录下的资源文件删除了,不会更新部署包中的相关文件;但是会更新编译输出目录下的相关文件(在 run 和 debug 模式下)
6.resources 目录下的资源文件修改了,会更新部署包中的相关文件;也会更新编译输出目录下的相关文件(在 run 和 debug 模式下)
7.webapp 目录下的静态资源文件修改了,会更新部署包中的相关文件(在 run 和 debug 模式下)
8.webapp 目录下的静态资源文件删除了,不会更新部署包中的相关文件(在 run 和 debug 模式下)
9.webapp 目录下的静态资源文件新增了,分为两种情况,如果是复制新增的文件,则不会更新到部署包中;如果是正常新建的文件则会更新到部署包中(在 run 和 debug 模式下)
汇总 -deploy/redeployrun/rerunUpdate resourcesUpdate classes and resourcesBuild ModuleRebuild ModuleJava 文件的修改会更新编译输出目录(默认是 target/classes)下的字节码文件,也会更新部署包中的字节码文件会更新编译输出目录(默认是 target/classes)下的字节码文件,也会更新部署包中的字节码文件不会更新到部署包中(在 run 和 debug 模式下)在 run 模式或者 debug 模式下会更新编译输出目录下的相关字节码文件;也会更新部署包中的相关字节码文件。但是在run模式下,只是更新了部署包中的字节码文件而已,如果这个类已经加载进入内存中了,内存中的 Class 对象还是旧的,所以执行的代码并没有更新。但是在 debug 模式下,不仅会更新部署包中的相关字节码文件,还会更新内存中的 Class 对象,所以执行的是最新的代码。会更新编译输出目录(通常是 target/classes)的相关字节码文件。会更新编译输出目录(通常是 target/classes)的相关字节码文件。Java 文件的删除会更新编译输出目录下的字节码文件,也会更新部署包中的字节码文件会更新编译输出目录下的字节码文件,也会更新部署包中的字节码文件不会更新到部署包中(在 run 和 debug 模式下)在 run 模式或者 debug 模式下会更新编译输出目录下的相关字节码文件;也会更新部署包中的相关字节码文件。但是在 run 模式下只是把部署包中的相关字节码文件删除了,但是已经加载入内存的类对应的 Class 对象并没有被释放,依旧在内存中,所以你依旧可以照常访问相关的资源;而在 debug 模式下,则会把已经加载入内存的类所对应的 Class 对象释放掉,你无法再访问有关的资源。会更新编译输出目录(通常是 target/classes)的相关字节码文件。会更新编译输出目录(通常是 target/classes)的相关字节码文件Java 文件的新增无论复制新增还是正常新建 Java 文件,会更新编译输出目录下的字节码文件,也会更新部署包中的字节码文件无论复制新增还是正常新建 Java 文件,会更新编译输出目录下的字节码文件,也会更新部署包中的字节码文件不会更新到部署包中(在 run 和 debug 模式下)无论复制新增还是正常新建 Java 文件,在 run 模式或者 debug 模式下会更新到编译输出目录下,也会更新到部署包中无论复制新增还是正常新建的 Java 文件,都会更新到编译输出目录下无论复制新增还是正常新建的 Java 文件,都会更新到编译输出目录下resources 目录下的文件修改会更新到编译输出目录下的相关文件,也会更新部署包中的 classes 目录下的相关文件会更新到编译输出目录下的相关文件,也会更新部署包中的 classes 目录下的相关文件会更新部署包中的相关文件;也会更新编译输出目录下的相关文件(在 run 和 debug 模式下)会更新部署包中的相关文件;也会更新编译输出目录下的相关文件(在 run 和 debug 模式下)会更新编译输出目录(通常是 target/classes)的相关文件。会更新编译输出目录(通常是 target/classes)的相关文件。resources 目录下的文件删除会更新到编译输出目录下的相关文件,也会更新部署包中的 classes 目录下的相关文件会更新到编译输出目录下的相关文件,也会更新部署包中的 classes 目录下的相关文件不会更新部署包中的相关文件;但是会更新编译输出目录下的相关文件(在 run 和 debug 模式下)不会更新部署包中的相关文件;但是会更新编译输出目录下的相关文件(在 run 和 debug 模式下)会更新编译输出目录(通常是 target/classes)的相关文件会更新编译输出目录(通常是 target/classes)的相关文件resources 目录下的文件新增分为两种情况,如果是正常创建的文件会更新到编译输出目录下,也会更新到部署包中的 classes 目录下;如果是复制新增的文件则不会更新到编译输出目录下,也不会更新到部署包中分为两种情况,如果是正常创建的文件会更新到编译输出目录下,也会更新到部署包中的 classes 目录下;如果是复制新增的文件则不会更新到编译输出目录下,也不会更新到部署包中分为两种情况,如果是复制新增的文件,则不会更新到部署包中,也不会更新到编译输出目录下;如果是正常新建的文件则会更新到部署包中,也会更新到编译输出目录下(在 run 和 debug 模式下)分为两种情况,如果是复制新增的文件,则不会更新到部署包中,也不会更新到编译输出目录下;如果是正常新建的文件则会更新到部署包中,也会更新到编译输出目录下(在 run 和 debug 模式下)如果是复制新增的文件,Build Module 不会更新到编译输出目录下;如果是正常新增的文件,Build Module 会更新到编译输出目录下无论是复制新增还是正常新建的文件,都会更新到编译输出目录下webapp 目录下的文件修改会更新部署包中的相关文件会更新部署包中的相关文件会更新部署包中的相关文件(在 run 和 debug 模式下)会更新部署包中的相关文件(在 run 和 debug 模式下)webapp 目录下的文件删除会更新部署包中的相关文件会更新部署包中的相关文件不会更新部署包中的相关文件(在 run 和 debug 模式下)不会更新部署包中的相关文件(在 run 和 debug 模式下)webapp 目录下的文件新增分为两种情况,如果是复制新增的文件,则不会更新到部署包中;如果是正常新建的文件则会更新到部署包中分为两种情况,如果是复制新增的文件,则不会更新到部署包中;如果是正常新建的文件则会更新到部署包中分为两种情况,如果是复制新增的文件,则不会更新到部署包中;如果是正常新建的文件则会更新到部署包中(在 run 和 debug 模式下)分为两种情况,如果是复制新增的文件,则不会更新到部署包中;如果是正常新建的文件则会更新到部署包中(在 run 和 debug 模式下)