今天我研究了一上午,尝试了下用jetty配合eclipse调试web项目。
####why choose jetty
eclipse本来不就有server插件的嘛,可以直接用tomcat呀,为嘛要用jetty呀?
嗯哼,前几天调试代码的时候,有不知道那个文件被锁住还是神马的,class没有拷贝到eclipse的temp tomcat目录里面。害得我又浪费时间,以为是小伙伴的代码出了问题,各种看别人代码。。。
####why tomcat with eclipse sometimes make me crazy
eclipse的workplace里面项目多了以后好像是经常性抽筋额。是神马原因造成的呢?
嗯哼,我就说说maven的web项目,在eclispe里面每次按下ctrl+s
保存代码时maven会把编译好的代码放到target里面,然后如果配置了server的话,还会编译一份到eclipse的workplace里面的某号temp server里面比如
X:\project_workplace\.metadata\.plugins
\org.eclipse.wst.server.core\tmpx\m2ewebapp\WEB-INF\classes
嗯,一份代码,竟然需要复制到2个地方。我猜可能是内存不够或者某原因文件被锁。so,总之没复制全,导致xxclass not found,或者别的类似错误。
那如果我用jetty的话,会怎样?我只要指定我的webapp的path是target目录,然后就不用管他了,也就没有了所谓的第二次的复制,异常发生机率更小了,即使发生异常,也只要delete掉target,然后rebuild就行了,不像eclipse还要clean server,有时clean server还会报exception,真让人想掀桌!!!
####config jetty plugin in maven
原来如此,那就赶紧配置maven的eclipse插件吧
1.在pom里面的 <build>
下加一个plugin
1 2 3 4 5 6 7 8 9 10
| <plugin> <groupId>org.eclipse.jetty</groupId> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <webApp> <descriptor>WebContent/WEB-INF/web.xml</descriptor> </webApp> </configuration> </plugin>
|
关于版本的选择
如果你是jdk7的话,那你可以用最与时俱进的jetty9啦,groupid用eclipse,不加version自动下载最新的版本,因为他是compiled by jdk7 所以不支持jdk6 :p
org.eclipse.jetty’s maven仓库
由于我还在用苦逼的6,groupid得用org.mortbay.jetty ,jetty8
org.mortbay.jetty’s maven仓库
2.将编译的class的目标目录改到WebContent/WEB-INF/class下面(也可以通过改eclipse的project的build的target,改pom的话,在家用idea继续写代码就不用再改啦)
<outputDirectory>WebContent/WEBINF/classes</outputDirectory>
3.mvn jetty:run 起动
####reference
http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html
http://blog.log4d.com/2011/04/run-jetty-in-maven/
http://stackoverflow.com/questions/10426557/missing-maven-plugin-jetty
6月22号更新
最近切换到idea后,尝试下新的玩法。
总的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| <build> <sourceDirectory>src/main/java</sourceDirectory> <testSourceDirectory>src/test/java</testSourceDirectory> <resources> <resource> <directory>src/main/resource</directory> </resource> <resource> <directory>src/main/conf/${envcfg.dir}</directory> </resource> </resources> <testResources> <testResource> <directory>src/test/resource</directory> </testResource> </testResources> <directory>${project.basedir}/target</directory> <finalName>${project.artifactId}</finalName> <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <webResources> <resource> <directory>WebContent</directory> </resource> </webResources> </configuration> </plugin> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <stopKey>foo</stopKey> <stopPort>9998</stopPort> <webAppSourceDirectory>${basedir}/WebContent</webAppSourceDirectory> <webApp> <contextPath>/</contextPath> <descriptor>${basedir}WebContent/WEB-INF/web.xml</descriptor> </webApp> <scanIntervalSeconds>3</scanIntervalSeconds> </configuration> <executions> <execution> <id>start-jetty</id> <phase>pre-integration-test</phase> <goals> <goal>run</goal> </goals> <configuration> <daemon>true</daemon> <reload>automatic</reload> </configuration> </execution> <execution> <id>stop-jetty</id> <phase>post-integration-test</phase> <goals> <goal>stop</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
|
直接终端下 mvn jetty:run 启动,如果加上启动参数便可以远程调试,是不是很像play
不过我还是直接idea里直接跑吧。。。