1. 程式人生 > >Java Web/Eclipse/Maven/Tomcat

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
    ,因為我們要建立一個web專案

  • 如下圖輸入 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,有什麼錯誤的地方望大神指出,好做學習。謝謝。