Java Web/Eclipse/Maven/Tomcat
Java Web/Eclipse/Maven/Tomcat
最近有個新專案是java web專案,記錄一下,可能比較亂。雖然沒接觸過Java,但是eclipse還是用過的
初識專案
同事說,專案是maven打包的,可以用maven開啟服務,我就研究了一下,由於專案不能外露,我先建立一個demo的專案。
用eclipse 建立 Maven web專案
開啟eclipse File->New->Maven Project。如果預設列表中沒有Maven Project 選擇 Other...
如下圖,什麼不用選擇,直接Next
- 如下圖,請選擇 maven-archetype-webapp
- 如下圖輸入 group id 與 artifact id 點選finish即可
- 下面配置一個Tomcat Apache 伺服器
- 訪問 tomcat 官網下載壓縮包,並解壓。
- 在 eclipse中依次開啟 Window->Preferences
如圖一次找到 Server->Runtime Environments 點選子面板上的 Add 按鈕
選擇你自己的下載的tomcat 版本,我下載的是7,點選Next
找到剛才解壓好的Tomcat路徑,點選finish
- 下面直接將,剛才的Maven專案放到 Tomcat中執行。
專案上右鍵依次 Run As-> Run on Server,選擇剛才新增的Tomcat,
上圖,成功開啟WebApp
使用Maven自己建立Web專案
下面介紹如何用CMD,自己用maven 命令列建立web專案
- 到maven官網下載 maven,下載後解壓
- 到環境變數去配置 maven 命令,將 [your maven path]/bin配置到path中
- 隨意開啟一個CMD 鍵入 mvn --version
# 打出版本資訊 Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00) Maven home: C:\Workflow\apache-maven-3.6.0\bin\.. Java version: 1.8.0_172, vendor: Oracle Corporation, runtime: C:\Program Files (x86)\Java\jdk1.8.0_172\jre Default locale: en_US, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "x86", family: "windows"
- CD 到你想要建立專案的目錄下,鍵入如下命令:
mvn archetype:generate # 建立
-DgroupId=packageName # 相當於 eclipse裡面的groupid
-DartifactId=webappName # 相當於 eclipse裡面的artifactid
-DarchetypeArtifactId=maven-archetype-webapp #相當於在eclipse中選擇maven-archetype-webapp
# 命令請弄成一行,執行
mvn archetype:generate -DgroupId=packageName -DartifactId=webappName -DarchetypeArtifactId=maven-archetype-webapp
#這裡說明一下,在之前的maven版本使用create,在3.0.5版本之後使用generate替代create了
#貼一下成功的結果
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-bundles/2/maven-archetype-bundles-2.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-bundles/2/maven-archetype-bundles-2.pom (1.5 kB at 2.2 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetype/maven-archetype-parent/1/maven-archetype-parent-1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetype/maven-archetype-parent/1/maven-archetype-parent-1.pom (1.3 kB at 1.9 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/4/maven-parent-4.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/4/maven-parent-4.pom (10.0 kB at 15 kB/s)
[INFO] Using property: groupId = packageName
[INFO] Using property: artifactId = webappName
Define value for property 'version' 1.0-SNAPSHOT: : test
[INFO] Using property: package = packageName
Confirm properties configuration:
groupId: packageName
artifactId: webappName
version: test
package: packageName
Y: :
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: C:\Workflow\Eclipse WS
[INFO] Parameter: package, Value: packageName
[INFO] Parameter: groupId, Value: packageName
[INFO] Parameter: artifactId, Value: webappName
[INFO] Parameter: packageName, Value: packageName
[INFO] Parameter: version, Value: test
[INFO] project created from Old (1.x) Archetype in dir: C:\Workflow\Eclipse WS\webappName
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 43.033 s
[INFO] Finished at: 2018-12-18T14:48:42+08:00
[INFO] ------------------------------------------------------------------------
- 直接鍵入 mvn tomcat:run,經過maven一頓自動下載之後,會開啟tomcat
C:\Workflow\Eclipse WS\webappName>mvn tomcat:run
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< packageName:webappName >-----------------------
[INFO] Building webappName Maven Webapp test
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] >>> tomcat-maven-plugin:1.1:run (default-cli) > compile @ webappName >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ webappName ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ webappName ---
[INFO] No sources to compile
[INFO]
[INFO] <<< tomcat-maven-plugin:1.1:run (default-cli) < compile @ webappName <<<
[INFO]
[INFO]
[INFO] --- tomcat-maven-plugin:1.1:run (default-cli) @ webappName ---
[INFO] Running war on http://localhost:8080/webappName
[INFO] Using existing Tomcat server configuration at C:\Workflow\Eclipse WS\webappName\target\tomcat
十二月 18, 2018 3:07:41 下午 org.apache.catalina.startup.Embedded start
INFO: Starting tomcat server
十二月 18, 2018 3:07:41 下午 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.29
十二月 18, 2018 3:07:41 下午 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
十二月 18, 2018 3:07:41 下午 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
瀏覽器 訪問上面提供的網址,發現報錯了。如下圖
- 調查之後發現是tomcat的版本與jdk版本不符合,我的本地是1.8這樣我們需要tomcat7來執行,上面eclipse安裝的恰好還是7
開啟專案目錄下的pom.xml檔案,在build標籤下增加如下內容
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<uriEncoding>UTF-8</uriEncoding>
<url>http://localhost:8080</url>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
- 重新鍵入命令 mvn tomcat7:run,經過一頓下載之後開啟tomcat7
C:\Workflow\Eclipse WS\webappName>mvn tomcat7:run
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< packageName:webappName >-----------------------
[INFO] Building webappName Maven Webapp test
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) > process-classes @ webappName >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ webappName ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ webappName ---
[INFO] No sources to compile
[INFO]
[INFO] <<< tomcat7-maven-plugin:2.2:run (default-cli) < process-classes @ webappName <<<
[INFO]
[INFO]
[INFO] --- tomcat7-maven-plugin:2.2:run (default-cli) @ webappName ---
[INFO] Running war on http://localhost:8080/webappName
[INFO] Using existing Tomcat server configuration at C:\Workflow\Eclipse WS\webappName\target\tomcat
[INFO] create webapp with contextPath: /webappName
十二月 18, 2018 3:26:14 下午 org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
十二月 18, 2018 3:26:14 下午 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
十二月 18, 2018 3:26:14 下午 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.47
十二月 18, 2018 3:26:16 下午 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
訪問瀏覽器,發現可以正常顯示Hello World
至此,使用maven 建立了一個web專案並執行起來
使用jetty執行Maven 專案
給我專案中,我是用jetty起來的,沒有使用tomcat,介紹下jetty的使用方法
- 接著上面的專案來,我們直接更改pom.xml檔案,放到
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.5</version>
<configuration>
<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
<scanIntervalSeconds>0</scanIntervalSeconds><!--這個是jetty支援的java熱部署,但是不建議使用-->
<contextPath>/webappName</contextPath>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8080</port>
</connector>
</connectors>
</configuration>
</plugin>
- 關閉剛才開啟的tomcat,鍵入 mvn jetty:run
# maven 一頓安裝之後,輸出如下,
[INFO] Configuring Jetty for project: webappName Maven Webapp
[INFO] Webapp source directory = C:\Workflow\Eclipse WS\webappName\src\main\webapp
[INFO] web.xml file = C:\Workflow\Eclipse WS\webappName\src\main\webapp\WEB-INF\web.xml
[INFO] Classes = C:\Workflow\Eclipse WS\webappName\target\classes
[INFO] Logging to org.slf4j.impl.MavenSimpleLogger(org.mortbay.log) via org.mortbay.log.Slf4jLog
[INFO] Context path = /webappName
[INFO] Tmp directory = C:\Workflow\Eclipse WS\webappName\target\work
[INFO] Web defaults = jetty default
[INFO] Web overrides = none
[INFO] Webapp directory = C:\Workflow\Eclipse WS\webappName\src\main\webapp
[INFO] Starting jetty 6.1.5 ...
[INFO] jetty-6.1.5
[INFO] No Transaction manager found - if your webapp requires one, please configure one.
[INFO] Started SelectChanne[email protected]:8080
[INFO] Started Jetty Server
- 開啟瀏覽器,重新輸入localhost:8080,還是能夠正常訪問Hello World
在 eclipse中,使用maven build web專案
Eclipse中當然也可以使用上面的maven 命令進行專案build
- 開啟Eclipse,將上面使用maven的專案Import到eclipse 工作目錄中。一次選擇 File->Import->,找到 Maven -> Existing Maven Project
- 開啟專案後,在匯入的專案上右鍵,依次找到 Run as -> Maven build...先配置下maven執行的命令,要選擇帶三個點的呦。
做如下的配置,
Console 輸出
- 增加另一個配置,配置 tomcat7:run
訪問瀏覽器會發現都可以訪問Hello World
Eclipse的Java 熱部署
改個java 程式碼就需要重新開伺服器感覺太耽誤效率了。最後瞭解到有一個叫Jrebel的外掛,下面介紹一下
依次點選 Help -> Eclipse Marketplace搜尋 Jrebel 外掛,依次安裝上,重啟Eclipse。
- 外掛需要啟用,這邊可以申請免費的有14天的免費試用時長。直接到官網註冊一個賬號就可以了。將license copy下來
依次開啟 Help->JRebel->Configuration配置lincense,免費的話選擇第三個Activation Code,將剛才註冊賬號時給的code複製進來就可以。在這裡推薦一個永久免費的,是我在網上找到的一個server:http://139.199.89.239:1008/,郵箱隨便輸入就好了。
- 由於我們在Eclipse裡面配置的,所以想要使用,Jrebel必須 Run on server使用Eclipse中的 tomcat
在你的Tomcat啟動之前在Console裡面看到如下輸出,證明你成功了:
2018-12-18 17:14:49 JRebel: Starting logging to file: C:\Users\kanewang\.jrebel\jrebel.log
2018-12-18 17:14:49 JRebel:
2018-12-18 17:14:49 JRebel: #############################################################
2018-12-18 17:14:49 JRebel:
2018-12-18 17:14:49 JRebel: JRebel Agent 2018.2.3 (201811261141)
2018-12-18 17:14:49 JRebel: (c) Copyright ZeroTurnaround AS, Estonia, Tartu.
2018-12-18 17:14:49 JRebel:
2018-12-18 17:14:49 JRebel: Over the last 2 days JRebel prevented
2018-12-18 17:14:49 JRebel: at least 8 redeploys/restarts saving you about 0.3 hours.
2018-12-18 17:14:49 JRebel:
2018-12-18 17:14:49 JRebel: License acquired from License Server: http://139.199.89.239:1008
2018-12-18 17:14:49 JRebel:
2018-12-18 17:14:49 JRebel: Licensed to kanewang.
2018-12-18 17:14:49 JRebel:
2018-12-18 17:14:49 JRebel:
2018-12-18 17:14:49 JRebel: #############################################################
2018-12-18 17:14:49 JRebel:
我們改一個java程式碼
- 這裡會發現建立的maven專案中沒有java程式碼,我們接下來介紹下,如何使用spring框架
- 我們首先在main資料夾下建立一個目錄java
- 然後再java資料夾下床建一個package,找不到package選擇 other搜尋一下 package,我的包叫kane1
- 在kane1包下建立檔案test1Controller.java,這個controller目前還不能被web訪問到。
- 在 main/webapp/WEB_INF下建立一個xml,名字隨意,我的是spring-servlet.xml,並寫入如下內容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <mvc:default-servlet-handler/> <!-- Activates scanning of @Controller --> <!-- 這裡是你剛才定義的包位置,我只有一層 這裡是告訴spring kane1包下帶@Controller annotation的方法都有對映到servlet裡面去 --> <context:component-scan base-package="kane1" /> <mvc:annotation-driven/> </beans>
- 下面更改pom.xml檔案,增加兩個包的依賴。
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.0.3.RELEASE</version> </dependency>
- 然後修改test1Controller.java,程式碼如下
package kane1; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class test1Controller { @RequestMapping(value = "test", method = RequestMethod.GET)//定義方法與url的對映關係 public @ResponseBody String test(HttpServletRequest request,HttpServletResponse response) { return "This is test1 controller's test function"; } }
重新啟動伺服器,在url中輸入 http://localhost:8080/kane1/test,上圖:
我們這個時候更改一下test1.Controller.java,將輸出更改為 "This is test1 controller's test function modify!",在console裡面看到如下提示證明JRebel成功在檢測java程式碼的變化
2018-12-19 10:01:06 JRebel: Reloading class 'kane1.test1Controller'.
- 我們不重啟tomcat,直接重新整理剛才的頁面,上圖:發現熱部署成功了。
- 最後再上一個,自動部署的截圖吧
命令列中使用JRebel 熱部署
Jrebel 本身支援很多種使用方式,下面我們再嘗試一下,自己在使用命令列,如何進行熱部署的配置。
- 到官網下載軟體的壓縮包,官網,然後解壓。上一下目錄結構
│ 3rd-party-licenses-jrebel.txt
│ Changelog.txt
│ jrebel.ico
│ jrebel.jar
│ jrebel.png
│ License.txt
│ readme.txt
│ ZeroTurnaround.url
│
├─bin
│ activate-gui.cmd
│ activate-gui.sh
│ activate.cmd
│ activate.sh
│ go-offline.cmd
│ go-offline.sh
│ jrebel-activation.jar
│
└─lib
jrebel32.dll
jrebel64.dll
libjrebel32.dylib
libjrebel32.so
libjrebel64.dylib
libjrebel64.so
#我們直接使用lib下的檔案,bin下的檔案是登入啟用使用的,因為在Eclipse裡面已經激活了,是不需要再次啟用的
- 在 cmd中開啟專案目錄,鍵入如下命令,這次我們以jetty開啟web 服務
set MAVEN_OPTS=-agentpath:[your extract path]\lib\jrebel32.dll
# 設定環境變數,後面是32還是64看你的jdk位數,錯了會提醒你的
- 確保一件事情,開啟pom.xml,保證jetty的自動部署時間scanIntervalSeconds是0,也就是關閉掉
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<scanIntervalSeconds>0</scanIntervalSeconds>
</configuration>
</plugin>
- CMD中鍵入 mvn jetty:run開啟服務:
#看到如下輸出,就證明成功了
2018-12-19 10:20:49 JRebel: Starting logging to file: C:\Users\kanewang\.jrebel\jrebel.log
2018-12-19 10:20:49 JRebel:
2018-12-19 10:20:50 JRebel: #############################################################
2018-12-19 10:20:50 JRebel:
2018-12-19 10:20:50 JRebel: JRebel Agent 2018.2.3 (201811261141)
2018-12-19 10:20:50 JRebel: (c) Copyright ZeroTurnaround AS, Estonia, Tartu.
2018-12-19 10:20:50 JRebel:
2018-12-19 10:20:50 JRebel: Over the last 2 days JRebel prevented
2018-12-19 10:20:50 JRebel: at least 12 redeploys/restarts saving you about 0.5 hours.
2018-12-19 10:20:50 JRebel:
2018-12-19 10:20:50 JRebel: License acquired from License Server: http://139.199.89.239:1008
2018-12-19 10:20:50 JRebel:
2018-12-19 10:20:50 JRebel: Licensed to kanewang.
2018-12-19 10:20:50 JRebel:
2018-12-19 10:20:50 JRebel:
2018-12-19 10:20:50 JRebel: #############################################################
2018-12-19 10:20:50 JRebel:
- 我們繼續更改test1Controller.java,將test1輸出改為 "This is test1 controller's test function modify again!"
#繼續看cmd輸出
[WARNING] !RequestLog
[INFO] Started [email protected]:8080
[INFO] Started Jetty Server
# 有下面這句
2018-12-19 10:22:49 JRebel: Reloading class 'kane1.test1Controller'.
上結果圖,輸出變化了。
給個官網的關於自己配置JRebel的連結 連結
總結
我們這個專案比較老,用的spring MVC框架,但是需要配置比較繁瑣。所以上面的東西可能都已經沒啥用了,本人也是初學者。目前應該都是使用Spring boot建立了,推薦一個線上建立專案的網址,很好用。Spring Boot 等再說了。本人真的是一點沒學過java,有什麼錯誤的地方望大神指出,好做學習。謝謝。