使用Intellij Idea有一段时间了(将近一年),从一开始的不习惯,到现在的高效开发,一切都显得是那么的自然而然。

由于前段时间一直做的项目并非传统Web项目,而是纯Restful风格的WebService,故而没有使用到基本的Servlet Api(Restful采用封装好的框架——Jersey,开发时不涉及Servlet Api的调用),也没有直接引入诸如Tomcat之类中间件自带的Jar包,所以一直没有发现问题。

直到最近,一个小项目的兄弟神奇的采用了Tomcat6的工具类实现文件上传,他开发使用的是eclipse,切换到我的Intellij Idea上面,发现编译不通过,就顺手在Libraries里面添加了Tomcat的Lib目录,自以为完美解决了,不料Tomcat6、Tomcat7启动时均会报错,有一段时间甚至引入Tomcat6的Lib,运行在Tomcat7下,由于关键API改动不大,而用到的Tomcat6文件上传工具类在Tomcat7更名或移除了,所以这样奇葩的开发了近一周时间,通过查看编译后的输出文件,了解到,Intellij Idea是吧Tomcat的Jar包也同时输出了,当然,打包的时候也会包含在War包内,不过由于项目紧张,一时没来得及找方法,后面实在不爽,就留意了一下网友们的说法:

Tomcat6报错java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor

Tomcat7报错org.apache.catalina.deploy.WebXml addFilter…

其实均为同一错误,就是项目内打包了Tomcat的Jar包,大部分人给出的解决方案是在Tomacat的context.xml文件里的<Context>中加上<Loader delegate=”true” />,尝试了,确实可用,于是这样又使用了两三天。

之后想到,如果部署生产环节的话,每次更改Tomcat配置肯定不爽,之前使用eclipse的时候Tomcat的Jar包实际是以Runtime Libraries的形式引入的,运行或输出War包的时候,根本不会进入包内,既然如此,Intellij Idea这么风靡的IDE,应该也会有此类功能吧?

事实证明,确实如此,由于Intellij Idea的智能,之前曾在尝试移除Artifacts中Tomcat Jar包时候,曾提示可以把Tomcat Lib添加至Artifacts或者设置为Provided,但是设置之后发现还是不可用,于是就没有继续尝试。这次尝试中,发现,在Intellij Idea的Libraries中添加的Java Lib实际上自动带入了Modules的Dependencies,在这里即可选择Java Lib的作用域(Scope),也有Runtime,但是选择了还是会报错,而Provided则依然有问题,最后尝试性的将Tomcat的Lib从Libraries移除,打算在Dependencies中直接添加,才发现自己真是傻到爆了,在Dependencies的添加列表里面选择Library…菜单,打开窗口中就已经包含了Application Server Libraries(汗颜),选中之后Scope类型直接就是Provided,重新启动Tomcat,完美运行了,创建Archive包时也不会输出Tomcat的Lib了。

本打算配图,但是由于操作简单,而且可能官网有类似说明,而我没注意到,所以这里不再班门弄斧了,仅简单记录一下,供有需要又恰巧和我一样糊涂的朋友一阅。