java教程 关于idea对javaweb项目的编译打包配置详细说明 和 deployment source 'xxx:war exploded' is not valid全面分析

关于idea对javaweb项目的编译打包配置

  • 基于maven的javaweb目录结构
  • idea javaweb的编译设置说明
    • 配置idea编译javaweb项目
    • 配置idea编译并且生成产品artifact
    • 将artifact发布到外部的tomcat
  • 关于Configuration Error: deployment source 'xxx:war exploded' is not valid错误 分析

基于maven的javaweb目录结构

如果你创建的maven项目的目录比我标出来的少,按照我展示的目录结构新增文件结构即可。

|--- pom.xml
|--- web
      |--- META-INF
      |--- WEB-INF
              |--- web.xml
|--- src
      |--- main
             |--- java
                    |--- package(com.mz)
                                |--- controller
                                |--- service
                                |--- serviceImpl
                                |--- mapper
                                |--- entity
                                |--- utils
                                |--- config
             |--- source
                  |--- 各种资源文件,最终会被编译到classes目录

      |--- test
            |--- java
                  |--- package(com.mz)


idea javaweb的编译设置说明

如果不是springboot项目,那么需要依赖外部的tomcat来启动并发布项目。

步骤有三个:

  • 配置idea编译javaweb项目。
  • 配置idea编译并且生成产品artifact。
  • 将artifact发布到外部的tomcat。


配置idea编译javaweb项目

步骤:右键项目,点击Project structure。这个就是配置idea为项目进行编译以及生成打包文件配置的地方。(mac的idea,project structure在菜单File中)
java教程 关于idea对javaweb项目的编译打包配置详细说明 和 deployment source 'xxx:war exploded' is not valid全面分析_第1张图片

  • Project概念

    • idea中的project,并不是代表当前项目的意思,而是表示项目空间,是多个项目的集合。相当于eclipse的workspace。
    • project中用于指定所有项目的jdk版本,以及所有项目编译文件输出目录。
    • project中只用于配置jdk版本即可。当然你会发现有个橙色的out目录,是由这里的配置生成的。


      java教程 关于idea对javaweb项目的编译打包配置详细说明 和 deployment source 'xxx:war exploded' is not valid全面分析_第2张图片
  • Modules概念 – 掌管当前项目中的所有编译配置

    • modules就是配置本项目的位置。new Module或者import module就是导入一个项目进来进行配置。
    • 你对当前项目中的所有编译配置(项目编译成class文件)都在modules中。看上图’spring-test’表示当前项目。‘web’表示这是个javaweb项目。
    • 点击‘spring-test’, sources用于指定项目中的文件目录代表何种资源。比如蓝色的sources表示该目录是源码文件,目录中的java文件会被编译成class字节码文件。绿色的tests表示是单元测试文件。Resources表示是项目依赖的资源文件,会被拷贝到编译后的classes目录下。Excluded表示这个目录不需要处理。
    • 点击‘spring-test’,Paths用于配置编译后的文件位置,这里仅仅指定项目编译文件的输出目录。就是项目编译运行时,会出现一个橙色目录Target的原因。这里的paths设置不会影响项目的打包以及发布。就是说项目出现的部署错误,跟这里绝对没关系。生成后的target目录也是可以删除的
    • 点击‘spring-test’,Dependencies目录表示本项目依赖的第三方库。一般maven的项目会自动导入。如果是本地的jar包,可以点击+进行导入。
    • 点击’Web’, 这里是对本项目的web配置,Deployment Descriptors用于指定web.xml的位置。 Web resource Directories拥有指定javaweb的web目录。

  • Libraries 概念
    这里是Modules中的Paths的配置,建议在modules中配置即可。

  • Facets 概念
    这里是对Module中Web的配置,建议在modules中配置即可。

  • Artifacts 概念
    这里就是对编译后的文件打包的配置。如果没有artifact,点击+号,然后选择exploded(表示可以直接在toomcat运行的文件目录,即war包在tomcat解压的目录)。 如果是要打成war包,选择Archive。

    • 这里需要注意 ‘Output directory’,/Users/mengze/Desktop/spring-test/out/artifacts/spring_test_war_exploded这个就是 打包文件的目录。
    • 关于WEB-INF, classes, lib,以及 web facet都不用更改。 其中WEB-INF就是javaweb项目中根目录中的WEB-INF, classes表示编译后的java文件目录。 lib表示jar库文件目录。web facet表示web目录下的文件。


配置idea编译并且生成产品artifact

Artifacts上其实点击+号就能正确生成。不过说明下目录的作用

|--- WBE-INF
       |--- classes    
               |--- xxx compile output 这里存放被sources标记的文件编译目录。只有被编译的文件才会被编译并且放到这个文件中。sources中如果有xml等资源文件,是不会被复制到classes中的。如果sources中存在资源文件,可以使用maven预编译进行资源文件复制配置。
     
      |--- lib 这个是第三方库的目录。maven引入的库自动导入到其中。如果有依赖本地的jar包,可以在lib中查看是否已经导入。
       
      |--- facet resources 这是是项目源码中对应的web目录下的资源文件,比如index。html, web.xml,  jsp目录等。编译到项目的WEB-INF目录下。     
      


将artifact发布到外部的tomcat

java教程 关于idea对javaweb项目的编译打包配置详细说明 和 deployment source 'xxx:war exploded' is not valid全面分析_第3张图片
点击Unamed,点击Edit Configurations。
java教程 关于idea对javaweb项目的编译打包配置详细说明 和 deployment source 'xxx:war exploded' is not valid全面分析_第4张图片
将本地tomcat与当前项目的发布包Artifacts进行绑定的位置就是Deployment, 点击+号,然后选择 exploded就行。这样发布包的部署就设置完成。

另外,注意Application Context, 表示访问的上下文。 比如设置 /root , 那么访问接口就变成了 http://localhost:8080/root/xxxx 。



关于Configuration Error: deployment source ‘xxx:war exploded’ is not valid错误 分析

上面对编译,打包,部署在idea中的配置位置都做了说明。

  • 错误的介绍:
    部署的资源包是无效(不可用)的。

  • 下面来分析错误能出现的原因以及位置。
    • 原因1:编译阶段的问题 ==> java源程序编译不过去。导致没有生成Artifacts,所以部署就会报 ‘war不可用’。这个是代码问题 或者 project structure中 modules配置问题
    • 原因2:打包阶段的问题 ==> 没有在project structure中的Artifacts中去配置 exploded,根本就没有生成artifact。这个是’project structure中 artifacts’配置问题
    • 原因3:发布阶段的问题 ==> 虽然正确生成了artifact,但是Edit configuration中的deployment没有与该artifa绑定。 这个是Edit Configurations中deployment的配置问题

    • 还补充一个新手容易出现的问题。虽然不是上面的问题,但是会在正确部署没有报错之后,依然404的问题。
      • 使用springmvc时,有些人会配置(比如我)拦截所有的请求,然后发现访问localhost:8080访问不到index.html文件。以及访问第一个@requestMapping(“/hello”)对应的接口时,也出现了404,因为处理器方法返回的string,是对应的/WEB-INF/jsp/下的success.jsp文件,因为没有创建success.jsp文件而报错。

你可能感兴趣的:(javaWeb)