一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

由ClassPathXmlApplicationContext加載的classpath是哪里引發(fā)的思考

 一本正經(jīng)地胡鬧 2019-05-09

當(dāng)用Spring的當(dāng)用ClassPathXmlApplicationContext獲取應(yīng)用上下文時(shí)。有兩種方法。

  1. ApplicationContext context = new FileSystemXmlApplicationContext("c:/knight.xml");
  2. ApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");

FileSystemXmlApplicationContext引用的是具體文件系統(tǒng)的文件路徑,而ClassPathXmlApplicationContext
在classpath找到xml文件


剛開始使用的是用Maven所構(gòu)建的web項(xiàng)目。當(dāng)前項(xiàng)目位于G:/newtool/workspace/springmvc中
knight.xml是放在src/main/java中。如果放到了src/main/java/di中,構(gòu)造參數(shù)應(yīng)該傳入"di/knight.xml"
不然是找不到文件的。


先看看maven創(chuàng)建的標(biāo)準(zhǔn)的目錄布局:
Introduction to the Standard Directory Layout
src/main/java/     源文件
src/main/resources  資源文件

但是如果把knight.xml放到src/main/resources中時(shí),并不需要構(gòu)造參數(shù)應(yīng)該傳入"src/main/resourcesres/knight.xml"
而是直接傳入"knight.xml"。


這里就會意識到問題了,這樣看的話,我們要先找出classpath是哪里。

  1. String s[] = System.getProperty("java.class.path").split(";");
  2. for (String string : s) {
  3. System.out.println(string);
  4. }

打印出來的包含G:/newtool/workspace/springmvc
還有就是bulid path還有classpath。
建議先看下兩個(gè)問題回答,我翻譯一些很好的解釋。
http:///questions/12893760/spring-cannot-find-bean-xml-configuration-file-when-it-does-exist
http:///questions/3529459/what-is-the-difference-between-class-path-and-build-path


先說classpath,classpath會告訴java編譯器還有運(yùn)行時(shí)去找的編譯好的class。典型的是JAR文件名稱還有目錄的一個(gè)序列。


Build path并不是java的術(shù)語,它用來構(gòu)建應(yīng)用,包含編譯該應(yīng)用的所有源文件和java庫。
IDE通過這個(gè)配置classpath和sourcepath。


所以,我run的時(shí)候,發(fā)現(xiàn)xml放在src/main/resources也好,放在src/main/java也好。
其實(shí)現(xiàn)在我們用慣了IDE之后忽略了一個(gè)問題。就是運(yùn)行前還有進(jìn)行一些操作的時(shí)候,
IDE都幫你重新構(gòu)建項(xiàng)目了,所以放到這兩個(gè)目錄里面。


將run的配置設(shè)置成運(yùn)行前不自動build。然后手動刪除
G:/newtool/workspace/springmvc目錄下的xml文件,便會出現(xiàn)找不到xml的錯誤了。


前面我們是用了Maven構(gòu)建,我們?nèi)绻肈ynamic Web Project的時(shí)候。
classpath是在G:\newtool\workspace\SpringMVCweb\build\classes類似這樣的目錄下面的。
所以具體的還是在Eclipse這邊控制。


至于后面使用:
  1. public class KnightMain {
  2. public static void main(String[] args) throws Exception {
  3. System.setProperty("java.class.path","G:/newtool/workspace;G:/newtool");
  4. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");
  5. Knight knight = context.getBean(Knight.class);
  6. knight.embarkOnQuest();
  7. String s[] = System.getProperty("java.class.path").split(";");
  8. for (String string : s) {
  9. System.out.println(string);
  10. }
  11. context.close();
  12. }
  13. }

為什么沒有改變到classpath,xml還是正常加載到。
如果build是編譯的話,和最原始的javac又有什么區(qū)別呢?


因?yàn)槭菑挠⒄Z的思維去思考的,還有這些糾結(jié)幾個(gè)英文單詞的話,中文很難找到答案。所以這次自己是自己在Stackoverflow提了自己第一個(gè)英文問題。雖然英文寫的蹩腳。
http:///questions/39585055/whats-the-differences-between-the-build-function-of-eclipse-and-javac


最后的到了答案,好感謝這位德國朋友。
更改的JVM的classpath并不是當(dāng)前運(yùn)行的,所以現(xiàn)在正在編譯運(yùn)行的還是原來的目錄。
所以xml還是正常找到。所以并影響到的是新的加載器,如果要想這樣,我們需要去用這個(gè)加載器去重新加載
整個(gè)spring的東西。確實(shí)這個(gè)真正相關(guān)的是Eclipse本身類加載器的一些配置上面了。追根到底的話。
不知道我為什么會問這種這么理論的問題,不過偶爾思考下問題也是好的。            

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    高潮日韩福利在线观看| 高清免费在线不卡视频| 久久热麻豆国产精品视频| 国产一区二区三区色噜噜| 中文久久乱码一区二区| 国产不卡视频一区在线| 九九热这里只有精品视频| 99久只有精品免费视频播放| 日韩一区二区三区免费av| 久久亚洲精品成人国产| 久久老熟女一区二区三区福利| 午夜精品国产精品久久久| 91超精品碰国产在线观看| 欧美区一区二在线播放| 91人妻人人精品人人爽| 中国美女草逼一级黄片视频| 深夜少妇一区二区三区| 在线欧美精品二区三区| 日韩一级毛一欧美一级乱| 日韩中文字幕视频在线高清版 | 九九热这里有精品20| 亚洲男女性生活免费视频| 高清欧美大片免费在线观看| 欧美一区二区三区高潮菊竹| 丰满人妻一二三区av| 夫妻性生活动态图视频| 日韩欧美综合中文字幕| 久久国产亚洲精品成人| 国产永久免费高清在线精品| 国产成人亚洲欧美二区综| 在线观看中文字幕91| 五月婷婷六月丁香狠狠| 激情综合网俺也狠狠地| 亚洲精品熟女国产多毛| 国产精品欧美激情在线观看| 午夜福利精品视频视频| 一区二区三区日韩经典| 国产精品人妻熟女毛片av久| 国产目拍亚洲精品区一区| 亚洲欧美日韩综合在线成成| 日本欧美视频在线观看免费|