部署IDEA +maven+springmvc+dubbo项目

    最近开发了一个项目,记录一下部署要点。

    项目采用IDEA开发,框架使用maven+spring mvc+dubbo。

    首先,新建项目。新建的时候先建maven,再添加spring mvc框架。具体可以参考IDEA搭建SpringMVC并用maven配置的小例子(非常详细)

   建项目的时候不要跟之前已删除过的项目重名,我发现如果重名后在maven初始化构建时很容易失败。现在还没有深究原因。

    如果要使用dubbo,那么新建项目的时候一定要选择spring mvc的版本是4以下的版本,我选择的是“3.2.18”。因为4以上改动非常大。

    设置IDEA为自动下载jar包的源码与文档,点OK。


    如果Plugins有报错,就说明maven包需要的插件没有下载好,可以自己在本地用cmd 进入maven命令来手动下载。命令mvn install或者 mvn help:system

     如果Dependencies有报错(有红色波浪线),就说明使用了maven会有依赖冲突。这时候需要选择界面右测的在垂直滚动条那里的按钮“Maven Projects”,选择按钮“Show depedencies”。打开后会有一张【层级图】。图里如果有红色线就代表这里存在传递依赖冲突。以“最短路径为准”的原理,将另一个冲突包选中,然后右键,选择exclude。这时候,就会在pom.xml里面自动生成配置进行包排除。

    我是写完代码后,再加上springmvc注解的配置。springmvc有两个重要配置:applicationContext.xml与dispatcher-servlet.xml。其中,dispatcher-servlet.xml他是与对应的servlet相关的名称,你的servlet叫什么,他就会生成“xxx_servlet.xml”的文件。

    applicationContext.xml与dispatcher-servlet.xml这两个文件的区别在于:

  •     applicationContext.xml主要是与spring mvc密切关联,所以我会把bean定义会写在这里。当然啦,如果你全写在dispatcher-servlet.xml里面也是可以的。因为你写一个helloworld的时候,applicationContext.xml其实是空的。写这些的时候主要是那个beans里面的XML配置实在是太难配了。所以一般我会找一个DEMO直接把引入头拷贝进去再慢慢进行对比筛选。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/tool
        http://www.springframework.org/schema/tool/spring-tool.xsd">

    <bean id="connConfig" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>/WEB-INF/conf/connConfig.properties</value>
            </list>
        </property>
        <property name="fileEncoding" value="UTF-8"></property>
    </bean>
    <bean id = "propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
        <property name="properties" ref="connConfig"></property>
    </bean>
    <import resource="dubbo.xml"/>
</beans>
  • dispatcher-servlet.xml主要是与servlet相关,全局的配置会写在这里。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/tool
    http://www.springframework.org/schema/tool/spring-tool.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
    <context:component-scan base-package="com.lalalala.controller"/>
    <!-- 对静态资源文件的访问, 将无法mapping到Controller的path交给default servlet handler处理 -->
    <mvc:default-servlet-handler/>
    <!-- 启用spring mvc 注解, 默认的注解映射的支持 -->
    <mvc:annotation-driven />


</beans>

    web.xml会自动生成配置。需要注意的地方有两个:

  • 配置文件的路径:配置文件路径在标签<param-value>里面,会有classpath*:与相对路径“WEB-INF/XXX....”这样子的写法。classpath指代的是src路径下的文件,而相对路径指代的是在本项目里路径。在IDEA下,文件夹的路径是不包含在包路径里面,只是单纯为了管理项目用的。
  • url-pattern需要设置为<url-pattern>/<url-pattern>

    新建项目的时候不知道IDEA生成的时候会把WEB-INF放在一个叫web的文件夹下面?放在下面以后路径一定不可以用classpath来指定。

    项目部署需要进入到“Project Structure”(在界面右上角)

    

    打开Artifacts将项目打成war包。步骤可以参考具体可以参考IDEA搭建SpringMVC并用maven配置的小例子(非常详细)。这时会有两个选择:war与war explore的区别【war与war explore的区别】。一般我们会使用war exploded,毕竟热部署可以减少重启次数。


    使用Dubbo时需要注意Controller,我们都是会使用一个interface作为接口类放在Controller中,但是这个接口类是不可以注册为bean,所以我们需要Dubbo在内存中注册一个bean,将这个接口类临时声明为bean,这样,可以在springmvc中使用。如果配置成功后Controller里面的接口类对象声明还有波浪线,不要紧的,继续执行就好。

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://code.alibabatech.com/schema/dubbo
	http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="${dubbo.appliaction}"/>这个是写在配置文件里面的,可以随意起名
    <dubbo:registry address="${dubbo.registry.address}"/>
    <dubbo:protocol name="${dubbo.protocol}"/>

    <!-- consumer -->
    <dubbo:consumer timeout="${dubbo.timeout}"/>

    <dubbo:reference id="invoiceAPI" interface="com.invoice.service.api.lalalala"
                     url="${dubbo.url}/com.lalalala.service.api.lalaAPI"/>
</beans>

    实际运行起来,IDEA是把tomcat作为一个容器进行使用。

    对应的地址在“C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat”路径下,一个项目一个容器。

    若在运行运行时,出现404报错。首先可以定位tomcat是否已正常启动:可以把tomcat安装目录下的ROOT项目放在tomcat的Deployment里面进行部署(注意:在IDEA里面部署的时候,Application context在同一个tomcat容器里部署的应用一定要作区分。Application context可以只为/,也可以不跟项目名相同。)。重新启动tomcat的时候,可以根据/ROOT去访问,看下是否可以打开tomcat的那只喵咪网页。如果成功打开,则代表tomcat已经正常启动了。否则,tomcat启动失败。

    若tomcat启动报错的时候,出现NoSuchClass或NoSuchMethod这种字样,那有大概率说明项目里存在jar包冲突 。如果是类冲突,此时可以用ctrl+N去查看一个类是不是指向两个包中的对应类,如果有,就用Maven Projects来进行exclude。如果没有找到类的源文件,则去查找对应的jar包,并引入。NoSuchMethod的话,说明引用缺失。

    一步一步排查,最后成功。


遗留问题:

Q:IDEA里面新建的项目里会有两级存放WEB-INF的目录,web/webappsrc/webapp,其中,web与src是同级的区别 ?

A:没有什么区别,就是不同框架新建起来不同的目录的配置。主要还是看配置里配的是哪个。配置如下


Q:TOMCAT启动的时候没有报错,但是你进入程序的时候外层的类实例是被初始化,假设为A a。但是a.x1就没有被初始化,x1是类B的实例。

A:在<dispatcher-servlet.xml>及<applicationContext.xml>文件中一定要加入<context:annotation-config>这一句。这句是spring中开启@Authwired注解方法的。

Q:<context:annotation-config>与<mvc:annoation-driven>的区别

A:<context:annotation-config>是spring用于开启@Authwired注解; <mvc:annoation-driven>是spring mvc用于开启@Authwired注解

为什么IDEA自带的maven不好用呢?

为什么exclude会变成灰色?










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章