添加web外观

首先需要运行的项目需要具备web的外观。idea将一个项目识别为web项目,是通过facets来识别的。如果一个module未设置web外观,那idea并不知道这是一个web工程。

为module增加web外观,可在项目点右键,选择Open Module Settings,打开Project Structure,在Modules里面选中需要添加的工程,点上方+号,选择web即可。或者在Facets里面点+号,选择web,再选择对应的工程。

添加artifacts

添加好web外观后,idea认识这是一个web项目了。但要将Module放在idea的web容器里面运行,还需要为项目增加Artifacts,idea里面的web容器运行web项目是以Artifacts作为载体。

这个Artifacts我理解就是idea将项目抽象出来的一个概念,作用是整合编译后的 java 文件,资源文件等。参照多态的概念,抽象有多个实现,Artifacts有多个整合方式,比如war、jar、war exploded 等。其中war exploded 其实是war包压缩前的内容,一般开发阶段都选择这个。

为项目添加Artifacts,同样先打开Project Structure,选择Artifacts,点+号,选择Web Application:Exploded,选择From Modules,选择对应的Module即可。

添加web容器

添加完Artifacts,就可以将module放到web容器运行了。

idea的web容器是需要手工添加的,常用的就是tomcat。

添加方法:菜单选择Run->Edit Configurations->±>Defaults->Tomcat Server->Local,将Application server设置为自己电脑上的tomcat。然后Deployment里点+号,选择刚才添加的Artifacts,同时设置Application context。这个Application context就是浏览器访问地址的第一层目录,如Application context设置为/hello,那么浏览器访问的时候地址就是http://localhost:8080/hello/action。这个Application context一般不要以/结尾,这个是规则,虽然不影响运行,但是运行起来之后,Application Servers里面显示这个Artifacts是一个黄色的警叹号,正常应该是绿色的对号。

idea 导入java工程 idea导入javaweb项目后怎么运行_idea 导入java工程


日志中警告如下:

12-Dec-2021 22:32:32.016 警告 [localhost-startStop-1] org.apache.catalina.core.StandardContext.setPath A context path must either be an empty string or start with a ‘/’ and do not end with a ‘/’. The path [/sheet/] does not meet these criteria and has been changed to [/sheet]需要注意的是在上面截图中的server图标上右击鼠标也可以添加Artifacts,但这个添加并不会真正将module发布出去,必须要从Run的Deployment里面添加才会真正发布项目。否则只在server图标上添加,运行之后容器并未加载到这个应用,如下图中的interceptor。

idea 导入java工程 idea导入javaweb项目后怎么运行_java_02

日志中信息如下:

[2021-12-12 10:41:30,513] Artifact sheet:war exploded: Error during artifact deployment. See server log for details.
 [2021-12-12 10:41:30,526] Artifact interceptor:war exploded: Error during artifact deployment. See server log for details.
 [2021-12-12 10:41:30,527] Artifact interceptor:war exploded: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException: E:\idea\out\springmvcStudy\classes\artifacts\interceptor_war_exploded not found for the web module.

ok,大功告成!