工作需要用到Jetty作爲web容器,得知Eclipse+Maven+Jetty的組合很不錯,因此到網上查找了很多教程,但是或多或少寫的不詳細或者有過時的內容在裏面導致最後配置失敗,爲了以後同事配置方便,寫下這篇配置教程,順便來方便一下大家。
用到的參考資料如下: 【用Maven構建Java Web開發環境(Jetty容器)】(以此教程爲主)http://sarin.iteye.com/blog/784275 以及 http://sarin.iteye.com/blog/784697 【使用maven加載項目中缺少的jar包】http://blog.csdn.net/daven_java/article/details/8775809 【Stackoverflow- maven jetty - org.mortbay.jetty vs org.eclipse.jetty】http://stackoverflow.com/questions/15386461/maven-jetty-org-mortbay-jetty-vs-org-eclipse-jetty |
在此首先感謝這些作者的心血,把這些結合在一起我才終於配置成功。
下面開始正題。
=======================軟件環境=======================
『系統』Windows 7 x64
『JAVA』JDK 1.7.0_65
『Eclipse』 Eclipse for JavaEE
『Maven』 Apache Maven 3.2.2
『Jetty』 jetty-distribution-8.1.15
=======================配置過程=======================
一、JAVA和Maven的配置(如果都配置好了而且清楚maven的用法可以直接跳過看第二部分)
這部分我就直接使用參考資料中的教程了,因爲寫得比較詳細也沒有錯誤。
(源地址:http://sarin.iteye.com/blog/784275)
Maven是構建Java應用的優秀管理工具,是Apache軟件基金會的頂級項目。其具有開發目錄構建和管理,統一管理第三方依賴,編譯,測試,打包,發佈等功能。最大的特點要數第三方依賴管理了,因爲其它功能都能從Ant中找到蹤影。以往每個項目獨立管理依賴,使得每個項目打包後都是巨大無比的,而真正的程序文件卻沒有多少,Maven接管第三方依賴後,我們的應用就只有程序文件了,沒有了jar包輕巧很多,而統一的管理,使得我們可以隨意獲取jar資源。
初學者使用Maven總是感覺很難上手,其中也有一部分人是被Maven下載資源那瘋狂的做法嚇退的,這就是Maven的精巧之處。從Apache官方網站下載的Maven工具僅僅2M大小,其中是不包含我們要使用的依賴的,那麼就要從網絡中獲取這些依賴,就是那個瘋狂下載的過程。下面我們從頭開始構建Maven環境,直到運行Jetty容器執行Web應用,這一切都很簡單。
下載Maven的開發包之後,解壓到一個固定的文件夾,建議不要使用漢字並在磁盤的根目錄下,這是比較好的實踐。那麼本文以Maven 3爲例來說明,Maven的位置是F:\Maven 3目錄。解壓後就要添加系統環境變量,這裏要說明,因爲Maven也是Java應用,所以JDK就必須要提前安裝並設置環境遍歷。將JAVA_HOME和M3_HOME單獨設置,防止其使用時不能用Path變量下發現所需路徑。下面是JAVA_HOME和M3_HOME的配置位置,這個因人而異,但是最好固定不要隨意修改。
在Path中,這樣來添加即可,非常簡單。
至此Maven已經安裝完成了,下面我們來驗證安裝,在CMD中輸入mvn –v
可以看到,已經識別mvn命令了。做點簡單的設置,就是第三方依賴下載的時候的存放位置,默認是在C盤用戶目錄的當前用戶文件夾下(如C:\用戶\Admin,這裏是Windows 7的命名方式),在這裏Maven會創建.m2文件夾,這裏面就會存放下載的類庫。當然我不想這些類庫放在C盤下,不是特別安全,我想讓它們存放在Maven安裝目錄下,那麼就可以這樣進行:在Maven安裝目錄的conf下打開settings.xml,這是對Maven進行設置的XML文件,這裏我們簡單設置第三方依賴的位置,如下設置:
- <localRepository>F:/Maven3/repository</localRepository>
這樣,那些瘋狂下載的依賴就在這個位置下了,要留給足夠大的空間,因爲依賴下載很可能佔用很大的一塊空間。爲什麼?下載後去看看它的真實面目就知道了。
下面我們就來創建應用目錄,使用mvn archetype:generate命令一步一步根據提示,選擇項目類型,添加groupId和artifactId就可以創建項目了,我們來看一下,這裏執行mvn archetype:generate -DarchetypeCatalog=internal命令,要手工設置一下項目類型分類屬性,可能因爲類型太多導致屏幕顯示不全,那麼我們就簡單來看幾個常用的就行,就是internal類型。執行該命令後,在控制檯我們看到有如下的內容。(切記這個操作位置就是生成項目目錄的位置)
這裏我們先選擇16是maven-archetype-quickstart,就是基本的JavaSE項目結構的構建,19是maven-archetype-webapp,用來創建簡單的Java Web應用,我們先選擇16來看看。
選擇16之後,Maven提示輸出groupId,就是我們的項目命名組成之一,沒什麼過多解釋的東西,artifactId用來標記項目名稱,它們兩個是聯合使用的。而package定義的是包名,我們在文件夾內就發現了demo命名的項目文件夾。看看這個目錄的結構,這是Maven爲我們創建的,就是一個標準的格式:
根目錄下有一個pom.xml,這就是項目的Maven配置文件,暫時不介紹其強大的功能,僅僅簡單看一下實際應用,這是基礎的目錄結構,Maven爲我們創建了一個Hello World的小程序,我們來運行它。想要運行這個程序,那麼就要編譯,mvn的編譯命令是mvn compile,這樣就爲我們編譯整個項目,這個操作要在demo目錄下完成。
回頭看看demo文件夾,多出一個target目錄,這就是我們的類路徑了,class文件就在下面。這個操作的逆過程是mvn clean,顧名思義,就是清理,清理生成的可執行部分,僅留下源碼部分,如下:
Maven執行了Deleting操作,刪除了target目錄。如果想執行程序,是需要class文件或jar文件的,前面的mvn compile命令僅僅是編譯,而沒有對應用進行打包發佈,而mvn package命令可以將應用打包(jar或war等),那麼我們就來爲項目打包發佈:
這個過程,Maven執行了很多操作,有日誌可以細看,其中還有測試過程,這是JUnit的測試。其實我們創建項目時,Maven爲我們引入的第一個依賴就是JUnit。下面我們來執行jar文件,運行程序。(當然執行class是一樣的效果)
這樣就得到執行效果了,Hello World!
二、Eclipse+Maven+Jetty配置過程
此時的demo就是Eclipse項目格式的了,出現了.project和.classpath文件。我們在Eclipse中引入這個項目,此時的Eclipse沒有安裝Maven插件,不能自動運行Maven命令,我們來安裝Maven的Eclipse插件M2E。
@echo off
set /p project_name=Name of the new project:
set /p producer_name=Name of the producer:
mvn archetype:generate -DgroupId=%producer_name% -DartifactId=%project_name% -DarchetypeArtifactId=maven-archetype-webapp -Dversion=1.0
cd %project_name%
mvn eclipse:eclipse
echo [Press any key to exit]
pause>nul
exit
寫入記事本保存成bat格式文件粘貼到workspace的目錄運行即可。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
下面就可以編寫Servlet了,很簡單,就輸出HelloWorld吧(編輯HelloWorldServlet.java)。 package org.ourpioneer.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorldServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.process(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.process(request, response);
}
private void process(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String title="Webapp Demo";
out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
out.println("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
out.println("<head>");
out.println("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />");
out.println("<title>" + title + "</title>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
源教程說需要再配置web.xml,而我用的eclipse自動配置完成了,所以這裏跳過。
<init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>false</param-value>
</init-param>
Jetty也準備了,運行命令是jetty:run,這要在Maven中設置,那麼需要在pom.xml中加入Jetty的插件的設置信息。這裏直接貼出其整體構建信息。
<build>
<finalName>demo</finalName>
<sourceDirectory>src/main/java/src</sourceDirectory>
<testSourceDirectory>src/test</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.0.0.v20130308</version> <!-- latest at time of writing -->
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.7</version>
<configuration>
<addVersionToProjectName>false</addVersionToProjectName>
<useProjectReferences>false</useProjectReferences>
<encoding>UTF-8</encoding>
<wtpmanifest>false</wtpmanifest>
<wtpapplicationxml>true</wtpapplicationxml>
<wtpversion>1.5</wtpversion>
<additionalBuildcommands>
<buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
<buildcommand>org.eclipse.wst.common.project.facet.core.builder</buildcommand>
<buildcommand>org.eclipse.wst.validation.validationbuilder</buildcommand>
</additionalBuildcommands>
<additionalProjectnatures>
<nature>org.springframework.ide.eclipse.core.springnature</nature>
<nature>org.maven.ide.eclipse.maven2Nature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
</additionalProjectnatures>
<classpathContainers>
<classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
</classpathContainers>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-beta-1</version>
<configuration>
<warName>webapp</warName>
</configuration>
</plugin>
</plugins>
</build>
而Maven如下配置即可:
如果你使用了80端口,在瀏覽器中訪問地址如下:http://localhost/你的項目名稱,之後,我們就看到了效果。