今天我研究了一上午,尝试了下用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
| 12
 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后,尝试下新的玩法。
总的配置文件
| 12
 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里直接跑吧。。。