程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 主要介紹JavaEE中Maven Web 項目的結構及其它幾個小問題,javaeemaven

主要介紹JavaEE中Maven Web 項目的結構及其它幾個小問題,javaeemaven

編輯:JAVA綜合教程

主要介紹JavaEE中Maven Web 項目的結構及其它幾個小問題,javaeemaven


    先說下本篇隨筆的目錄。

    1、介紹windows中環境變量Path與ClassPath的區別。

    2、可能導致命令行運行javac編譯成功,但 java命令 + 所要執行的類的類名 無效的原因。

    3、介紹Maven項目的結構。

    4、Eclipse中添加Jar包的兩種方式Add Jars 與 Add External Jars 的區別。

    5、Eclipse發布項目到Tomcat上可能導致Jar包丟失的原因。

    

    一、windows中環境變量Path與ClassPath的區別。

 

    Path變量:當你打開Windows的CMD(命令行窗口)時,若想執行一個exe文件,就需要先進入此exe文件所在的目錄,之後再輸入此exe文件的名稱來執行此exe文件。

      那麼問題來了,為什麼我們只要打開了CMD窗口,不論我們當前處在什麼路徑,輸入java命令都會有對應的提示呢?(也就是並不需要進入到java.exe所在目錄才能執行java.exe文件)(如下圖)

 

                 

          

        我的Java.exe文件在C:\Program Files\Java\jdk1.8.0_20\bin目錄下,也就是說雖然我現在的位置是D盤根目錄,但是我輸入了java命令,仍然執行了java.exe文件。這裡面就是Path環境變量在起作用。

   

      上面這張圖片就是我電腦上Path環境變量的設置情況。其中有一個就是%JAVA_HOME%\bin,也就是我電腦上JDK安裝目錄下的bin目錄,在這個bin目錄下就有我們剛剛執行的java.exe文件。

      當我們在CMD中輸入一條命令時,比如上面的java命令,操作系統會在當前目錄下查找是否有名字為java.exe的可執行文件,如果當前目錄下沒有找到,就會在環境變量Path中設置的路徑下面去找,比如上面的%JAVA_HOME%\bin路徑下,如果找到了,就會執行相應的exe文件,如果找不到,就會提示當前輸入的命令不存在。

      也就是說,Path環境變量可以簡化我們輸入的命令的作用,如果我們java這條命令用的頻繁的話,就可以通過設置Path變量來達到只輸入java就可以執行,而不必進入到其所在的目錄才能執行,可以減少我們的重復工作。

    

 ClassPath變量:ClassPath顧名思義,可以理解為Java的類查找路徑。這也是ClassPath與Path主要的區別,Path環境變量是操作系統使用的,而ClassPath是Java編譯器用來查找代碼中用到的類的路徑的。

   舉例:

1 package com.cnblog;
2 import undact.utils.GetTime; 3 public class Test { 4 public static void main(String[] args) { 5 System.out.println(GetTime.GetNowTime()); 6 } 7 }

 

       在這個Test類中,我導入了一個自定義的包undact.utils中的GetTime類,那麼當我在CMD中用javac編譯此文件時為什麼可以正確的找到這個類,通過編譯呢?

     因為我在環境變量的設置中在ClassPath環境變量中加上了undact.utils.GetTime類所在的路徑,這樣在編譯時編譯器就會通過查找ClassPath從而找到我引入的這個類,正確的對Test類進行編譯。這也就是ClassPath環境變量的功能。

  

  二、可能導致命令行運行javac編譯成功,但 java命令 + 所要執行的類的類名 無效的原因。

      還是以上面的Test.java文件為例,假設此文件的存放目錄為C:\Users\lenovo\Desktop\com\cnblog\Test.java,那麼當我們在CMD中進入到C:\Users\lenovo\Desktop目錄下,就可以通過javac Test.java命令對Test.java文件進行編譯,你也確實可以看見在當前目錄下生成了Test.class文件,但當你輸入java com.cnblog.Test時卻發現提示找不到主類。這是由於Test.java有自己所在的package,並不是屬於default package,所以你必須進入到其所在包的上一級目錄輸入命令才能執行,也就是說在本例中,你需要進入到C:\Users\lenovo\Desktop目錄下再輸入java com.cnblog.Test命令才能正確的執行。

 

  三、介紹Maven項目的結構。

                               

              如左圖所示,為典型的maven web項目結構,正規些的裡面還要用到src/test/java及src/test/resource文件夾。右圖為普通的web項目結構,都是使用Eclipse for JavaEE Developers 版本的Eclipse構建的。關於maven構建項目的好處及如何使用maven我這裡不談,只講下如何理解這樣的結構。有很多剛剛用maven構建web項目的人來說,有最疑惑的問題可能就是這種項目結構與我構建的普通web項目結構有何區別?如何把我以前做項目的經驗適用到這樣的項目結構中來?

     其實不論是maven web項目,還是普通的web項目,部署到服務器之後,其結構都是相似的,那麼為什麼從eclipse上看兩種結構差異這麼大,部署到服務器上結構卻又差不多呢?這其實是源於eclipse的配置選項,看懂這個配置就能明白這個問題了。

     

      上圖即為將一個Maven web項目部署到服務器上時的可選配置。source一欄代表你在Eclipse中看到的項目的結構,Deploy Path一欄代表部署後的對應路徑。也就是說src/main/java這個文件夾在部署到服務器上時將會被部署到對應的WEB-INF/class文件夾中,而Maven Dependencies中涉及到的jar包將會被部署到WEB-INF/lib文件夾中,其余以此類推。

      接下來我們再來看下一個普通web項目在部署到服務器上時的可選配置。

     

       可以看到項目中的/WebContent文件夾部署到服務器上時被放置在了服務器上此項目的根目錄中,/src文件夾則被放置在了服務器上的WEB-INF/classes文件夾下,與上述maven項目中src/main/java文件夾默認放置的路徑是相同的。

       無論是普通web項目,還是maven web項目,在服務器上項目結構都大致如下圖:

        

       這樣也有利於服務器統一對web項目的管理。

       由於上述原因,所以不論是maven web項目,還是普通的web項目,部署到服務器之後,其結構都是相似的。這樣我們就可以很容 易的把以前做普通web項目的經驗適用到maven web這樣的項目結構中。

  

  四、Eclipse中添加Jar包的兩種方式Add Jars 與 Add External Jars 的區別。

       當我們在項目中需要引入外部的jar包時,常用的可以有以下兩種選擇方式,

              圖1          圖2

       圖1為點擊Add Jars後的Eclipse中的選項,圖2為Add External Jars 後的Eclipse中的選項。兩圖比較可以看出,Add Jars是讓你在當前的工程中選擇jar包添加,Add External Jars是在任意位置選擇jar包添加。兩種方式均可,對我個人而言,常用的方式是在當前工程中新建一個lib文件夾,之後把要添加的jar包復制到此文件夾中,然後再利用Add Jars的方式把lib中的jar包添加到工程的Reference Library當中去。這樣做的好處是保證用到的jar包始終在工程中,不會被誤刪,便於項目的移植。Add External Jars 方式引入的Jar包可能會被不小心誤刪掉,比如說引入的jar包放在了桌面,清理桌面的時候誤刪jar包就會導致工程運行出錯。

  

  五、Eclipse發布項目到Tomcat上可能導致Jar包丟失的原因。

      如四所說,通過Add External Jars 方式引入的jar包在部署到服務器上時並沒有被拷貝,就會導致jar包丟失,運行時找不到jar包。

    而通過在項目中建立lib文件夾的方式引入外部jar包,在部署到服務器上時會根據你的配置選項把jar包自動copy到相應的文件夾,就不會出現jar包丟失的問題。

      

 

      

      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved