Maven——关于idea 2018.1版本集成tomcat7插件的问题解决

最近在学习尚学堂的idea使用教程中在maven的web工程创建阶段出现了一些问题,具体为两个情形,情形如下:

 

情形1

运用maven集成的tomcat插件,我们不需要将项目部署到tomcat中,直接通过maven的tomcat指令即可对项目进行部署和运行,大部分的tomcat7插件的部署步骤为在pom.xml文件中添加如下标签:


        
            
            
                org.apache.tomcat.maven
                tomcat7-maven-plugin
                
                
                    /
                    9090
                    UTF-8
                
            
        
    

但是添加后在idea的maven projects中会出现这样的错误

Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第1张图片

  • 解决1

  • 可以通过报错提示得知是插件的版本号未知,但是很多博客没有配置tomcat7-maven-plugin的版本却没有报错。我们访问tomcat7插件官网:http://tomcat.apache.org/maven-plugin.html,阅读说明得知现在的tomcat7插件有多个版本:
  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第2张图片
  • 因为在学习尚学堂的idea课程教程中,老师使用的idea版本是2017年版本,所以没有标注tomcat7插件的version标签也不会报错,推测这个问题的出现是idea软件的版本问题。
  • 我们在pom.xml文件中添加version标签,选择上述版本中的一个版本(这里选择2.2版本),就没有问题了
  • 
            
                
                
                    org.apache.tomcat.maven
                    tomcat7-maven-plugin
                    
                    2.2
                    
                        /
                        9090
                        UTF-8
                    
                
            
    
  • 结果1

  • 问题得到解决
  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第3张图片

情形2

在上述配置解决后,发现maven指令tomcat7:run无法启动hello_maven项目,但是将项目打包成war包部署到tomcat上则可以启动项目并正常访问,具体情况如下:

Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第4张图片

tomcat7:run命令运行的信息提示跳过没有war包的工程,所以问题是项目在经过tomcat7:run命令启动前没有被打包成war包,而将项目部署到tomcat上时,项目是被打包成war包的。

  • 解决2

  • 由于我们的项目通过tomcat7:run命令启动时,项目是没有被打包成war包。所以要在pom.xml中的tomcat插件配置的configuration中添加ignorePackaging标签,并标注为true,告诉tomcat忽略war包检查即可。
  •     
            
                
                
                    org.apache.tomcat.maven
                    tomcat7-maven-plugin
                    
                    2.2
                    
                        /
                        9090
                        UTF-8
                        
                        true
                    
                
            
        
  • 结果2

  • 问题得到解决
  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第5张图片

情形3

在学习尚学堂idea教程中,创建聚合工程后,在测试web项目的测试类中测试mapper可用

Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第6张图片

但是dao层使用maven的install命令报错:无法找到cn.usetc的artifactId,这是因为我们在安装dao层前没有安装dao的父工程manager,导致maven没有打包父工程的groupId:cn.uestc,自然直接安装子工程会报上述错误,所以我们只要clean后先安装manager就可以了。

情形四

学习尚学堂idea教程,在我们创建好dao层的接口与mapper.xml,web项目中的测试类测试持久层也能测试成功,并将web.xml、spring与springmvc的配置文件都配置好,并成功测试maven install所有聚合工程下的子项目后,我们启动父工程配置好的tomcat。结果出现了这样的错误:

Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第7张图片

对2号错误的后续报错补全:

 Bean creation exception on FactoryBean type check: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'usersMapper' defined in file [F:\my code\learnIdeaUse\manager\dao\target\classes\cn\uestc\dao\UsersMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory': : No qualifying bean of type [org.apache.ibatis.session.SqlSessionFactory] is defined: expected single matching bean but found 2: org.mybatis.spring.SqlSessionFactoryBean#0,org.mybatis.spring.SqlSessionFactoryBean#1;

分析4

报错很明显,因为有两个sqlSessionFactory存在破坏了Spring容器的单例模式,从而导致无法创建userMapper接口的实现类。出错原因大概率为配置文件的配置错误,一般错误有两个:

1.对sqlSessionFactory在配置文件中配置了两次,导致重复

2.对bean按照by type注入而不是by name注入,导致重复

  • 排查:

  • 由于bean的管理是tomcat容器首先纳入spring容器,spring容器在对配置文件扫描并进行反射类的注入,根据报错位置,我们需要对tomcat的配置文件web.xml以及spring的applicationContext-*.xml进行检查。其中对sping的配置文件首先检查与mybatis以及事务相关的配置文件:

  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第8张图片

  • 首先对dao层和tran事务切片层配置文件进行检查

  • dao:Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第9张图片

  • tran层:Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第10张图片

  • 问题找到了:我们在tran层import了dao层配置文件,就导致tran层中会存在dao层的bean,又由于web.xml是对所有spring的配置文件进行检测并进行bean的依赖注入,就导致dao层的配置文件中的bea被注入了两次,一次是扫描dao层配配置文件进行注入,一次是扫描tran层配置文件进行注入(因为tran配置文件import了dao层配置文件),所以会有两个sqlSessionFactory也就不奇怪了,那么usersMapper创建不成功也就找到了原因。

  • 为什么要在tran层导入dao层配置文件:由于我们tran层和dao层是分开配置的,tran层和dao层都需要数据库源的bean:dataSource。但是dataSource只是在dao层进行了配置,tran层并没有该bean。所以idea在项目部署前对xml进行检查时会对此进行报错(eclipse不会报错),说tran层中并没有dataSource的bean的相关配置。但是这个错误并不影响项目的正常启动,因为web.xml会对所有spring配置文件进行扫描并对其中的bean进行依赖注入,所以即使idea对tran层的xml文件检查并提示没有dataSource,但是在项目启动后,dataSource是会存在在容器中的。

  • 为什么test类测试mapper不会报错:

  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第11张图片

  • 这是因为ManagerTest类加载applicationContext-dao.xml是不通过容器扫描所有spring配置文件来加载的,是自己直接根据路径找到spring下面的dao层配置文件进行加载,测试类只加载了dao层配置文件,当然只会生成一个sqlSessionFactory的bean,自然不会报错。

  • 解决

  • 1.只需要将tran层的import去掉就可以了,不用理会idea的文件检查报错(eclipse就不会报这样的错误)
  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第12张图片
  • 2.如果不去掉import,则tran层的配置文件则包含了dao层配置文件,为了解决web.xml扫描两个dao层配置文件,可以将tran层配置文件也import到service层的配置文件中,这样service层的配置文件会包含一个tran层的和一个dao层的,并在web.xml中只扫描service层配置文件,而不是扫描applicationContext-*的所有配置文件,也可以解决问题
  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第13张图片
  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第14张图片
  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第15张图片
  • 结果4:成功

  • Maven——关于idea 2018.1版本集成tomcat7插件的问题解决_第16张图片

你可能感兴趣的:(maven,idea,web项目框架搭建)