Java?中?Class?Path?和?Package的使用詳解
一、 類(lèi)路徑 (class path)
當(dāng)你滿(mǎn)懷著希望安裝好了 java, 然后興沖沖地寫(xiě)了個(gè) hello world,然后編譯,運(yùn)行, 就等著那兩個(gè)美好的單詞出現(xiàn)在眼前, 可是不幸的是, 只看到了 Can't find class HelloWorld 或者 Exception in thread "main" java.lang.NoSuchMethodError : maain.為什么呢? 編譯好的 class 明明在呀.
我們一起來(lái)看一看 java 程序的運(yùn)行過(guò)程. 我們已經(jīng)知道 java 是通過(guò) java虛擬機(jī)來(lái)解釋運(yùn)行的, 也就是通過(guò) java 命令, javac 編譯生成的 .class文件就是虛擬機(jī)要執(zhí)行的代碼, 稱(chēng)之為字節(jié)碼(bytecode), 虛擬機(jī)通過(guò) classloader來(lái)裝載這些字節(jié)碼, 也就是通常意義上的類(lèi). 這里就有一個(gè)問(wèn)題, classloader 從哪里知道 java 本身的類(lèi)庫(kù)及用戶(hù)自己的類(lèi)在什么地方呢? 或者有著缺省值(當(dāng)前路徑).或者要有一個(gè)用戶(hù)指定的變量來(lái)表明, 這個(gè)變量就是類(lèi)路徑(classpath), 或者在運(yùn)行的時(shí)候傳參數(shù)給虛擬機(jī). 這也就是指明 classpath 的三個(gè)方法. 編譯的過(guò)程和運(yùn)行的過(guò)程大同小異, 只是一個(gè)是找出來(lái)編譯, 另一個(gè)是找出來(lái)裝載. 實(shí)際上 java 虛擬機(jī)是由 java luncher 初始化的, 也就是 java (或 java.exe)這個(gè)程序來(lái)做的. 虛擬機(jī)按以下順序搜索并裝載所有需要的類(lèi):
- 1, 引導(dǎo)類(lèi): 組成 java 平臺(tái)的類(lèi), 包含 rt.jar 和 i18n.jar 中的類(lèi).
- 2, 擴(kuò)展類(lèi): 使用 java 擴(kuò)展機(jī)制的類(lèi), 都是位于擴(kuò)展目錄($JAVA_HOME/jre/lib/ext)中的 .jar 檔案包.
- 3, 用戶(hù)類(lèi): 開(kāi)發(fā)者定義的類(lèi)或者沒(méi)有使用 java 擴(kuò)展機(jī)制的第三方產(chǎn)品. 你必須在命令行中使用 -classpath 選項(xiàng)或者使用 CLASSPATH 環(huán)境變量來(lái)確定這些類(lèi)的位置. 我們?cè)谏厦嫠f(shuō)的用戶(hù)自己的類(lèi)就是特指這些類(lèi).這樣, 一般來(lái)說(shuō), 用戶(hù)只需指定用戶(hù)類(lèi)的位置, 引導(dǎo)類(lèi)和擴(kuò)展類(lèi)是"自動(dòng)"尋找的.
那么到底該怎么做呢? 用戶(hù)類(lèi)路徑就是一些包含類(lèi)文件的目錄, .jar, .zip 文件的列表, 至于類(lèi)具體怎么找, 因?yàn)闋砍兜?package 的問(wèn)題, 下面將會(huì)說(shuō)到, 暫時(shí)可認(rèn)為只要包含了這個(gè)類(lèi)就算找到了這個(gè)類(lèi). 根據(jù)平臺(tái)的不同分隔符略有不同, 類(lèi) unix 的系統(tǒng)基本上都是 ":", windows 多是 ";". 其可能的來(lái)源是:
- 1.".", 即當(dāng)前目錄, 這個(gè)是缺省值.
- 2.CLASSPATH 環(huán)境變量, 一旦設(shè)置, 將缺省值覆蓋.
- 3.命令行參數(shù) -cp 或者 -classpath, 一旦指定, 將上兩者覆蓋.
- 4.由 -jar 參數(shù)指定的 .jar 檔案包, 就把所有其他的值覆蓋, 所有的類(lèi)都來(lái)自這個(gè)指定的檔案包中. 由于生成可執(zhí)行的 .jar 文件, 還需要其他一些知識(shí), 比如 package, 還有特定的配置文件, 本文的最后會(huì)提到. 可先看看 jdk 自帶的一些例子.
我們舉個(gè) HelloWorld 的例子來(lái)說(shuō)明. 先做以下假設(shè):
- 1.當(dāng)前目錄是 /HelloWorld (或 c:\HelloWorld, 以后都使用前一個(gè))
- 2.jdk 版本為 1.2.2 (linux 下的)
- 3.PATH 環(huán)境變量設(shè)置正確. (這樣可以在任何目錄下都可以使用工具)
- 4.文件是 HelloWorld.java, 內(nèi)容是:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!\n"); System.exit(0); } }
首先這個(gè)文件一定要寫(xiě)對(duì), 如果對(duì) c 熟悉的話(huà), 很有可能寫(xiě)成這樣:
public static void main(int argc, String[] argv) { .... }
這樣是不對(duì)的, 不信可以試一試. 由于手頭沒(méi)有 java 的規(guī)范, 所以作如下猜想: java 的 application 程序, 必須以 public static void main(String[])開(kāi)始, 其他不一樣的都不行.
到現(xiàn)在為止, 我們?cè)O(shè)置方面只設(shè)置了 PATH.
1, 當(dāng)前路徑就是指你的 .class 文件在當(dāng)前目錄下,
[HelloWorld]$ javac HelloWorld.java //這一步不會(huì)有多大問(wèn)題, [HelloWorld]$ java HelloWorld // 這一步可能就會(huì)有問(wèn)題.
如果出了象開(kāi)頭那樣的問(wèn)題, 首先確定不是由于敲錯(cuò)命令而出錯(cuò). 如果沒(méi)有敲錯(cuò)命令,那么接著做:
[HelloWorld]$ echo $CLASSPATH 或者 c:\HelloWorld>echo %CLASSPATH%
看看 CLASSPATH 環(huán)境變量是否設(shè)置了, 如果設(shè)置了, 那么用以下命令:
[HelloWorld]$ CLASSPATH= 或者 c:\HelloWorld> set CLASSPATH=
來(lái)使它為空, 然后重新運(yùn)行. 這次用戶(hù)類(lèi)路徑缺省的是 ".", 所以應(yīng)該不會(huì)有相同的問(wèn)題了. 還有一個(gè)方法就是把 "." 加入到 CLASSPATH 中.
[/]$ CLASSPATH=$CLASSPATH:. 或者 c:\HelloWorld> set CLASSPATH=%CLASSPATH%;.
同樣也可以成功. Good Luck.
2, 當(dāng)你的程序需要第三方的類(lèi)庫(kù)支持, 而且比較常用, 就可以采用此種方法.比如常用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序, 寫(xiě) servlet 需要的 servlet 包等等. 設(shè)置方法就是在環(huán)境變量中加入 CLASSPATH. 然后就可以直接編譯運(yùn)行了. 還是以 HelloWorld 為例, 比如你想在根目錄中運(yùn)行它, 那么你直接在根目錄下執(zhí)行
$ java HelloWorld 或者 c:\>java HelloWorld
這樣肯定會(huì)出錯(cuò), 如果你的 CLASSPATH 沒(méi)有改動(dòng)的話(huà). 我想大家應(yīng)該知道為什么錯(cuò)了吧, 那么怎么改呢? 前面說(shuō)過(guò), 用戶(hù)類(lèi)路徑就是一些包含你所需要的類(lèi)的目錄, .jar 檔案包, .zip 包. 現(xiàn)在沒(méi)有生成包, 所以只好把 HelloWorld.class 所在的目錄加到 CLASSPAT了, 根據(jù)前面的做法, 再運(yùn)行一次, 看看, 呵呵, 成功了, 換個(gè)路徑, 又成功了!! 不僅僅可以直接運(yùn)行其中的類(lèi), 當(dāng)你要 import 其中的某些類(lèi)時(shí), 同樣處理. 不知道你想到?jīng)]有, 隨著你的系統(tǒng)的不斷的擴(kuò)充, (當(dāng)然了, 都是一些需要 java 的東西).如果都加到這個(gè)環(huán)境變量里, 那這個(gè)變量會(huì)越來(lái)越臃腫, 雖然環(huán)境變量空間可以開(kāi)很大, 總覺(jué)得有些不舒服. 看看下面一個(gè)方法.
3, 在命令行參數(shù)中指明 classpath. 還是和上面相同的目標(biāo), 在任何目錄下執(zhí)行 HelloWorld, 用這個(gè)方法怎么實(shí)現(xiàn)呢?
[/]$ java -cp /HelloWorld HelloWorld 或者 c:\>java -cp c:\HelloWorld HelloWorld
就可以了. 這是這種方法的最簡(jiǎn)單的應(yīng)用了. 當(dāng)你使用了另外的包的時(shí)候, 還可以采用用這種方法.
例如:
$ javac -classpath aPath/aPackage.jar:. myJava.java $ java -cp aPath/aPackage.jar:. myJava 或者 c:\> javac -classpath aPath\aPackage.jar;. myJava.java c:\> java -cp aPath\aPackage.jar;. myJava
這種方法也有一個(gè)不方便的的地方就是當(dāng)?shù)谌桨诘穆窂捷^長(zhǎng)或者需要兩個(gè)以上包的時(shí)候, 每次編譯運(yùn)行都要寫(xiě)很長(zhǎng), 非常不方便, 這時(shí)候可以寫(xiě)腳本來(lái)解決.
比如一個(gè)例子:
compile (文件, 權(quán)限改為可執(zhí)行, 當(dāng)前目錄) $ cat compile --------------------------- #!/bin/bash javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. m yJavva.java --------------------------- run (文件, 權(quán)限改為可執(zhí)行, 當(dāng)前目錄) $cat run --------------------------- #!/bin/bash java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava --------------------------- 或者: compile.bat c:\HelloWorld> type compile.bat ------------------------- javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. m yJavva.java ------------------------- run.bat c:\HelloWorld> type run.bat ------------------------ java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava ------------------------
就可以了. 試試看.
前面提到了擴(kuò)展類(lèi), 擴(kuò)展類(lèi)是什么呢? java 的擴(kuò)展類(lèi)就是應(yīng)用程序開(kāi)發(fā)者用來(lái)擴(kuò)展核心平臺(tái)功能的 java 類(lèi)的包(或者是 native code). 虛擬機(jī)能像使用系統(tǒng)類(lèi)一樣使用這些擴(kuò)展類(lèi). 有人建議可以把包放入擴(kuò)展目錄里, 這樣, CLASSPATH 也不用設(shè)了,也不用指定了, 豈不是很方便? 確實(shí)可以正確運(yùn)行, 但是個(gè)人認(rèn)為這樣不好, 不能什么東西都往里擱, 一些標(biāo)準(zhǔn)的擴(kuò)展包可以, 比如, JavaServlet, Java3D 等等. 可以提個(gè)建議, 加一個(gè)環(huán)境變量, 比如叫 JARPATH, 指定一個(gè)目錄, 專(zhuān)門(mén)存放用戶(hù)的 jar zip等包, 這個(gè)要等 SUN 公司來(lái)做了. windows98 下, 我原來(lái)安裝的時(shí)候, 一直裝不上, 總是死機(jī), 好不容易裝上了, 缺省的是不能運(yùn)行正確的, 然后把 tool.jar 放入 CLASSPATH 后工作正常. 現(xiàn)在作測(cè)試,去掉仍然是正確的. 經(jīng)過(guò)多次測(cè)試, 發(fā)現(xiàn)如果原來(lái)曾裝過(guò) jdk 的都很好, 沒(méi)有裝過(guò)的,裝的時(shí)候會(huì)死機(jī), 多裝幾次就可以了. 如果你發(fā)現(xiàn)正確安裝后, 不能正常工作, 就把tools.jar 加入 CLASSPATH, 試一下.
二、 包 (package)
Java 中的 "包" 是一個(gè)比較重要的概念, package 是這樣定義的:Definition: A package is a collection of related classes and interfaces that provides access protection and namespace management. 也就是: 一個(gè)包就是一些提供訪(fǎng)問(wèn)保護(hù)和命名空間管理的相關(guān)類(lèi)與接口的集合. 使用包的目的就是使類(lèi)容易查找使用, 防止命名沖突, 以及控制訪(fǎng)問(wèn). 這里我們不討論關(guān)于包的過(guò)多的東西, 只討論和編譯, 運(yùn)行, 類(lèi)路徑相關(guān)的東西.至于包的其他內(nèi)容, 請(qǐng)自己查閱相關(guān)文檔. 簡(jiǎn)單一點(diǎn)來(lái)說(shuō), 包就是一個(gè)目錄, 下面的子包就是子目錄, 這個(gè)包里的類(lèi)就是這個(gè)目錄下的文件. 我們用一個(gè)例子來(lái)說(shuō)明.
首先建目錄結(jié)構(gòu)如下: PackageTest/source/, 以后根目錄指的是 PackageTest目錄, 我們的源程序放在 source 目錄下.
源程序如下:
PackageTest.java package pktest; import pktest.subpk.*; public class PackageTest { private String value; public PackageTest(String s) { value = s; } public void printValue() { System.out.println("Value of PackageTest is " + value); } public static void main(String[] args) { PackageTest test = new PackageTest("This is a Test Package"); test.printValue(); PackageSecond second = new PackageSecond("I am in PackageTest"); second.printValue(); PackageSub sub = new PackageSub("I am in PackageTest"); sub.printValue(); System.exit(0); } } PackageSecond.java package pktest; public class PackageSecond { private String value; public PackageSecond(String s) { value = s; } public void printValue() { System.out.println("Value of PackageSecond is " + value); } } PackageSub.java package pktest.subpk; import pktest.*; public class PackageSub { private String value; public PackageSub(String s) { value = s; } public void printValue() { PackageSecond second = new PackageSecond("I am in subpackage."); second.printValue(); System.out.println("Value of PackageSub is " + value); } } Main.java import pktest.*; import pktest.subpk.*; public class Main() { public static void main() { PackageSecond second = new PackageSecond("I am in Main"); second.printValue(); PackageSub sub = new PackageSub("I am in Main"); sub.printValue(); System.exit(0); } }
其中,Main.java是包之外的一個(gè)程序,用來(lái)測(cè)試包外的程序訪(fǎng)問(wèn)包內(nèi)的類(lèi),PackageTest.java屬于pktest這個(gè)包,也是主程序.PackageSecond.java也屬于pktest,PackageSub屬于pktest下的subpk包,也就是pktest.subpk.詳細(xì)使用情況,請(qǐng)參看源程序。
好了, 先把源程序都放在 source 目錄下, 使 source 成為當(dāng)前目錄, 然后編譯一下, 呵呵, 出錯(cuò)了,Main.java:1: Package pktest not found in import.import pktest.*; 這里涉及到類(lèi)路徑中包是怎么查找的, 前面我們做了一點(diǎn)假設(shè): "只要包含了這個(gè)類(lèi)就算找到了這個(gè)類(lèi)", 現(xiàn)在就有問(wèn)題了. 其實(shí) jdk 的 工具 javac javajavadoc 都需要查找類(lèi), 看見(jiàn)目錄, 就認(rèn)為是包的名字, 對(duì)于import 語(yǔ)句來(lái)說(shuō),一個(gè)包對(duì)應(yīng)一個(gè)目錄. 這個(gè)例子中, import pktest.*, 我們知道類(lèi)路徑可以包含一個(gè)目錄, 那么就以那個(gè)目錄為根, 比如有個(gè)目錄 /myclass, 那么就會(huì)在查找/myclass/pktest 目錄及其下的類(lèi). 所有的都找遍, 如果沒(méi)有就會(huì)報(bào)錯(cuò). 由于現(xiàn)在的類(lèi)路徑只有當(dāng)前目錄, 而當(dāng)前目錄下沒(méi)有 pktest 目錄, 所以就會(huì)出錯(cuò). 類(lèi)路徑還可以包含 .jar .zip 文件, 這些就是可以帶目錄的壓縮包, 可以把 .jar .zip文件看做一個(gè)虛擬的目錄, 然后就和目錄一樣對(duì)待了.
好了, 應(yīng)該知道怎么做了吧, 修改后的目錄結(jié)構(gòu)如下:
PackageTest | |__source Main.java | |__pktest PackageTest.java PackageSecond.java | |__subpk PackageSub.java
然后重新編譯, 運(yùn)行, 哈哈, 通過(guò)了. 我們?cè)賮?lái)運(yùn)行一下 PackageTest.
[source]$ java pktest/PackageTest
怎么又出錯(cuò)了?
Exception in thread "main" java.lang.NoClassDefFoundError: pktest/PackageTest 是這樣的, java 所要運(yùn)行的是一個(gè)類(lèi)的名字, 它可不管你的類(lèi)在什么地方, 就象我們前面所討論的一樣來(lái)查找這個(gè)類(lèi), 所以它把 pktest/PackageTest 看成是一個(gè)類(lèi)的名字了, 當(dāng)然會(huì)出錯(cuò)了, 應(yīng)該這么做,
[source]$ java pktest.PackageTest
大家應(yīng)該明白道理吧, 我就不多說(shuō)了. 注意 javac 不一樣, 是可以指明源文件路徑的, javac 只編譯, 不運(yùn)行, 查找類(lèi)也只有在源文件中碰到 import 時(shí)才會(huì)做, 與源文件所在的包沒(méi)有關(guān)系. 似乎還又些不好的地方, 怎么生成的 .class 文件這么分散呀, 看著真別扭. 別急,javac 有一個(gè) -d 命令行參數(shù), 可以指定一個(gè)目錄, 把生成的 .class 文件按照包給你好好地?cái)R在這個(gè)目錄里面.
[source]$ mkdir classes [source]$ javac -d classes pktest/PackageTest.java [source]$ javac -d classes Main.java
那么運(yùn)行怎么運(yùn)行呢?
[source]$ cd classes [classes]$ java pktest.PackageTest [classes]$ java Main
就可以了. 其實(shí) jdk 的這一套工具小巧簡(jiǎn)單, 功能強(qiáng)大, 不會(huì)用或者用錯(cuò)其實(shí)不關(guān)工具的事, 關(guān)鍵是明白工具背后的一些原理和必要的知識(shí). 集成環(huán)境是很好,但是它屏蔽了很多底層的知識(shí), 不出錯(cuò)還好, 一旦出錯(cuò), 如果沒(méi)有這些必要的知識(shí)就很難辦, 只好上 bbs 問(wèn), 別人只告訴了你解決的具體方法, 下一次遇到稍微變化一點(diǎn)的問(wèn)題又不懂了. 所以不要拘泥于工具, java 的這一套工具組合起來(lái)使用, 中小型工程(五六十個(gè)類(lèi)), 還是應(yīng)付得下來(lái)的.
三、 jar 文件
以下把 .jar .zip 都看做是 .jar 文件.
1, 從前面我們可以看出來(lái) jar 文件在 java 中非常重要, 極大地方便了用戶(hù)的使用. 我們也可以做自己的 .jar 包.
還是使用前面那個(gè)例子, Main.java 是包之外的東西, 用了 pktest 包中的類(lèi),我們現(xiàn)在就是要把 pktest 做成一個(gè) .jar 包, 很簡(jiǎn)單, 剛才我們已經(jīng)把 pktest中的 .class 都集中起來(lái)了,
就會(huì)生成 mypackage.jar 文件, 測(cè)試一下, 剛才我們生成的 Main.class 就在classes 目錄下, 所以, 從前面可以知道:
[classes]$ java -cp mypackage.jar:. Main
就可以運(yùn)行了.
2, 如果你看過(guò) jdk 所帶的例子, 你就會(huì)知道, .jar 還可以直接運(yùn)行,
[/demo]$ java -jar aJar.jar
那好, 就那我們的試一試,
看來(lái)我們的 jar 和它的 jar 還不一樣, 有什么不一樣呢? 拿它一個(gè)例子出來(lái),重新編譯, 生成 .jar 文件, 比較后發(fā)現(xiàn), 是 .jar 壓縮包中 META-INF/MANIFEST.MF文件不一樣, 多了一行, Main-Class: xxxxx, 再看看出錯(cuò)信息, 原來(lái)是沒(méi)有指定Main-Class, 看看 jar 命令, 發(fā)現(xiàn)有一個(gè)參數(shù) -m,-m include manifest information from specified manifest file
和出錯(cuò)信息有點(diǎn)關(guān)系, 看來(lái)它要讀一個(gè)配制文件. 只好照貓畫(huà)虎寫(xiě)一個(gè)了.
[classes]$ cat myManifest Manifest-Version: 1.0 Main-Class: pktest.PackageTest Created-By: 1.2.2 (Sun Microsystems Inc.) [classes]$ jar -cvfm mypackage.jar myManifest pktest added manifest adding: pktest/(in = 0) (out= 0)(stored 0%) adding: pktest/PackageSecond.class(in = 659) (out= 395)(deflated 40%) adding: pktest/subpk/(in = 0) (out= 0)(stored 0%) adding: pktest/subpk/PackageSub.class(in = 744) (out= 454)(deflated 38%) adding: pktest/PackageTest.class(in = 1041) (out= 602)(deflated 42%) [classes]$ java -jar mypackage.jar Value of PackageTest is This is a Test Package Value of PackageSecond is I am in PackageTest Value of PackageSecond is I am in subpackage. Value of PackageSub is I am in PackageTest
好了, 成功了, 這樣就做好了一個(gè)可以直接執(zhí)行的 .jar 文件. 大家可以自己試一試
做一個(gè)以 Main 為主程序的可執(zhí)行的 jar.
小結(jié):
這篇文章中, 我們討論了 java 中的 class path, package, jar 等基本但比較重要的東西, 主要是 class path. 并不是簡(jiǎn)單的一份 CLASSPATH 的完全功略, 而是試圖讓讀者明白其原理, 自己思考, 自己動(dòng)手. 其實(shí)大多數(shù)東西都在 sun 的 java doc中都有, 我只不過(guò)結(jié)合例子稍微談了一下, 希望能有所幫助. 由于條件所限, 只測(cè)試了jdk1.2.2 在 98 及 linux 的情況, 其他版本的 jdk 和平臺(tái)請(qǐng)大家自己測(cè)試, 錯(cuò)誤在所難免, 還請(qǐng)指正.
下面是一些需要注意的問(wèn)題:
- 1, 如果類(lèi)路徑中需要用到 .jar 文件, 必須把 jar 文件的文件名放入類(lèi)路徑, 而不是其所在的目錄.
- 2, 在任何時(shí)候, 類(lèi)名必須帶有完全的包名,
- 3, "." 當(dāng)前目錄最好在你的類(lèi)路徑中.下面是一些常見(jiàn)的編譯和運(yùn)行的模式.
4. To compile HelloWorld.java app in the default package in C:\MyDir, use CD \MyDir C:\jdk1.3\bin\Javac.exe -classpath . HelloWorld.java 5. To run a HelloWorld.class app, in the default package in C:\MyDir, use CD \MyDir C:\jdk1.3\bin\Java.exe -classpath . HelloWorld 6. To run a HelloWorld.class app, in the default package in a jar in C:\MyDir, use CD \MyDir C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar HelloWorld 7. To compile a HelloWorld.java app in C:\MyPackage, in package MyPackage, use CD \ C:\jdk1.3\bin\Javac.exe -classpath . MyPackage\HelloWorld.java 8. To run a HelloWorld.class app in C:\MyPackage, in package MyPackage, use CD \ C:\jdk1.3\bin\Java.exe -classpath . MyPackage.HelloWorld 9. To run a HelloWorld.class app in C:\MyPackage, in a jar in package MyPackage,, use CD \MyDir C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar MyPackage.HelloWorl
(注: default package 指的是在程序中不指定任何包). 最后一個(gè)小小的建議, 把 sun 的 jdk tools documentation 好好地看一看,把 jdk 的那些工具 java javac javadoc jar javap jdb......好好用一用, 會(huì)有好處的. The Simplest Is The Best.
到此這篇關(guān)于Java 中 Class Path 和 Package的使用詳解的文章就介紹到這了,更多相關(guān)Java Class Path 和 Package內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java的Hibernate框架中的繼承映射學(xué)習(xí)教程
Hibernate中的映射可以將類(lèi)與表對(duì)應(yīng),并利用類(lèi)的繼承特性,這里我們就來(lái)看一下Java的Hibernate框架中的繼承映射學(xué)習(xí)教程2016-07-07clickhouse?批量插入數(shù)據(jù)及ClickHouse常用命令詳解
這篇文章主要介紹了clickhouse?批量插入數(shù)據(jù)及ClickHouse常用命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03SpringBoot+Ant Design Vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出功能方式
這篇文章主要介紹了SpringBoot+Ant Design Vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01基于spring AOP @Around @Before @After的區(qū)別說(shuō)明
這篇文章主要介紹了基于spring AOP @Around @Before @After的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Java操作redis設(shè)置第二天凌晨過(guò)期的解決方案
這篇文章主要介紹了Java操作redis設(shè)置第二天凌晨過(guò)期的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01