首先我們來看看如何搭建最簡單的J2EE項目的開發環境。
1. 我們需要建立的一個空的J2EE項目的目錄結構
在這里,我簡單解釋一下這些目錄的作用:
src(source folder):存放所有的Java源代碼。
conf(source folder):存放所有的配置文件。
test(source folder):存放所有的Java測試代碼和調試代碼。
web:web項目的根目錄,下面有WEB-INF目錄以及在此之下的classes和lib目錄。classes目錄將會成為所有的source folder的編譯對象目錄,而lib目錄則存放項目所依賴的jar包。
lib:也存放jar包,這些jar包可能僅僅在開發調試時依賴,項目本身則不依賴這些jar文件。
2. 編寫IDE相關的文件
在這里,你還能看到classpath文件和project文件。這兩個文件是導入到eclipse中所必須的文件,是我為eclipse工程而寫的文件。如果你使用其他IDE,可能需要自行編輯與其他IDE相關的項目文件。
在建立了這些目錄結構后,你就可以將其導入到eclipse中作為eclipse的工程了。
3. 加入相關調試所需要的jar包,并指定classpath
接下來,我們把Jetty所需要的jar包copy到lib目錄下,并在IDE中指定classpath。
4. 添加Jetty啟動類
在test下建一個runtime的目錄,并添加Jetty啟動類。
- package runtime;
-
- import org.mortbay.jetty.Connector;
- import org.mortbay.jetty.Server;
- import org.mortbay.jetty.nio.SelectChannelConnector;
- import org.mortbay.jetty.webapp.WebAppContext;
-
-
-
-
-
-
- public class JettyStarter {
-
-
-
-
-
- public static void main(String[] args) throws Exception {
- long begin = System.currentTimeMillis();
- Connector connector = new SelectChannelConnector();
- connector.setPort(Integer.getInteger("jetty.port", 8080).intValue());
-
- WebAppContext webapp = new WebAppContext("web", "/struts-sample");
- webapp.setDefaultsDescriptor("./test/runtime/webdefault.xml");
-
- Server server = new Server();
- server.setConnectors(new Connector[] { connector });
- server.setHandler(webapp);
- server.start();
- System.out.println("Jetty Server started, use " + (System.currentTimeMillis() - begin) + " ms");
- }
- }
package runtime;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.webapp.WebAppContext;
/**
* Jetty Server starter. Use embedded mode.
*
* @author Downpour
*/
public class JettyStarter {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
long begin = System.currentTimeMillis();
Connector connector = new SelectChannelConnector();
connector.setPort(Integer.getInteger("jetty.port", 8080).intValue());
WebAppContext webapp = new WebAppContext("web", "/struts-sample");
webapp.setDefaultsDescriptor("./test/runtime/webdefault.xml");
Server server = new Server();
server.setConnectors(new Connector[] { connector });
server.setHandler(webapp);
server.start();
System.out.println("Jetty Server started, use " + (System.currentTimeMillis() - begin) + " ms");
}
}
如果此時,你在WEB-INF下有web.xml,那么你就可以執行上面這個Jetty的啟動類。
5. 啟動、調試、測試
執行了Jetty的啟動類后,可以看到啟動界面的日志:
- 15 [main] INFO org.mortbay.log - Logging to org.slf4j.impl.SimpleLogger(org.mortbay.log) via org.mortbay.log.Slf4jLog
- 15 [main] INFO org.mortbay.log - jetty-6.1.7
- 1109 [main] INFO org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
- Jetty Server started, use 1547 ms
15 [main] INFO org.mortbay.log - Logging to org.slf4j.impl.SimpleLogger(org.mortbay.log) via org.mortbay.log.Slf4jLog
15 [main] INFO org.mortbay.log - jetty-6.1.7
1109 [main] INFO org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
Jetty Server started, use 1547 ms
這表示你已經成功啟動了Jetty作為你的Web服務器。當然,你可以使用Debug模式來執行Jetty類,這樣就進入了調試模式,你可以在代碼中設置斷點進行調試。
在這里,還有一點需要簡單提一下,默認情況下,Jetty會在windows上使用緩存,所以會把js,css等文件進行鎖定,使你無法編輯。為了解決這個問題,需要設置一些默認參數。這里,我們可以使用google大法,已經有朋友為我們解決了這個問題:
http://m.tkk7.com/alwayscy/archive/2007/05/27/120305.html
所以,我在runtime的同級目錄建立了一個webdefault.xml文件,并且指定Jetty使用該文件作為默認的參數設定。
【小結】
在上面我介紹了我個人的開發調試環境,這種開發環境的好處可能有一下這些:
1. 開發環境不依賴于任何IDE或者相關的插件,只需要運行Java文件即可進行調試。(當然,你可能需要編寫IDE相關的project文件來獲取IDE的工程支持)
2. 開發環境不依賴于任何外部的Web服務器,與環境無關,所以無論將項目遷移到哪里,都可以直接運行。
3. 不需要開發人員額外學習如何搭建開發環境,開發環境已經內置,降低了開發人員的學習成本。
在上面搭建環境的過程中,我們發現,Library的管理存在著一定問題。這個問題主要表現為:
1.
不容易做Library的版本管理。如果Library的版本需要升級,那么我們不得不重新copy一份新的jar包,并且借助IDE重新指定項目的
classpath。這種勞動,對于一個項目還可以接受,如果你有10多個項目,那么jar包的復制工作會讓你很頭疼。
2.
每個項目都會有Library的副本。這一點讓人非常惱火。實際上,對于一個公司或者一個項目組而言,使用的技術體系基本不變。然而,每個項目的
Library卻是分開的。不僅如此,每個項目都要從svn中下載大量的相同的Library文件,給我們的硬盤造成極大的空間浪費。對于那些頻繁使用
Branch的項目來說,這些Library的下載簡直就是噩夢。
所以,我們需要一個
集中式的Library管理方式。而這一點曾經在Javaeye的海闊天空版激烈得討論過使用maven來進行管理還是自行管理。
Readonly 寫道
共享類庫可以用IDE reference project解決,公司內部項目給常用的lib建立一個project,從CVS上check
out,其他工程項目都依賴這個project就可以了,ant build也直接引用這個項目的jar就可以,項目體積照樣只有幾百K。
——一個討厭ant,更加討厭maven的人
我比較贊同Readonly老大的說法而傾向于自行管理。maven這樣的高級貨,偶實在是用不來啊。那么我們就來看看如何使用共享類庫來進行Library管理。
1. 首先建立一個共享類庫
建立一個共享類庫,將項目中需要共享的Library進行恰當的分類。同時,為每個加入到Library中的jar包進行統一的格式化的命名方
式。例如:spring/spring-2.5.5.jar等等。這樣的好處在于,一旦jar包的版本有更新,可以加入新的jar包而保留原來的。在項目
中,就可以通過引用不同版本的jar包來對Library進行版本管理。
以下就是我個人建立的一個共享類庫,大家可以參考:
svn://www.demo2do.com/library
2. checkout共享類庫,并將其導入到IDE中作為一個Library工程
3. 為你的項目指定classpath,引用的jar包存在于Library工程中
在這里,我們可以看到,原來項目中的lib目錄被刪除,jar包也被刪除。在項目中所引用的jar包是Library項目中的jar包。
【小結】
完成了上述所有的步驟之后,Library就被集中管理起來,而每個項目也不會再變得那么龐大。當然,開發環境的搭建完全取決于個人的習慣,所以使用各自喜歡的方式吧,不要讓環境問題束縛你們的手腳。
轉自:http://www.javaeye.com/wiki/struts2/1321-struts2-development-environment-to-build