先說下本篇隨筆的目錄。
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包丟失的問題。