1. 程式人生 > >myeclipse 生成jar包後,spring無法掃描到bean定義

myeclipse 生成jar包後,spring無法掃描到bean定義

myeclipse  jar add directory entries

之前,我曾經寫過一篇Java遍歷包中所有類,但經過一名網友提醒發現,只能適用於專案src中的包,當包在jar裡時就無法遍歷jar裡的類。就此我針對程式碼進行了細化,功能得到進一步的完善。

在分享原始碼之前,先說說我在遍歷jar包中的類時所遇到的困難。

這是我測試用的jar包,結構如下:


無論包是在src中還是在jar中,其實根本的思路還是根據給的包域名(如:com.wang.vo.request.hotel.test)定位到包的資源物件。包在src中,我們可以把它當做檔案File來進行處理,因此在src中包是以資料夾的形式來體現的,但在jar中,包的含義是有些不同的,我們不能把它當做File來對待(這樣你或得到的是jar的File物件)。那麼怎麼才能獲取jar裡包的資源物件呢?

程式碼如下:

public static void main(String[] args) throws Exception {  
    String packageName = "com/wang/vo/request/hotel/test";  
    URL url = Thread.currentThread().getContextClassLoader().getResource(packageName);  
    if (url != null) {  
        System.out.println(url.getPath());  
    }  
}  

但是通過上述程式碼,執行後卻發現url始終為空,嘗試過各種獲取資源的辦法(如getResourceAsStream),均無法解決,我試了試其他的jar包(如spring的),卻發現相同的程式碼url卻有值。經過我反覆的測試和分析發現,問題出現在生成jar包的方式

上,即所謂打jar包

一般來說,我們打jar包的步驟大致如下:



之後一直預設,然後Finish。這樣看似沒問題,但問題出現在這一步:


這種預設方式生成的jar包中,只含有class檔案,而並沒有我們大眾所知的資料夾目錄結構。可能我們大多數人認為com.test.Student類,Student類檔案就應該在com資料夾下的test資料夾裡,這其實是片面的,是一個誤區!

com.test真正的含義是package包域名,就好比.net裡的名稱空間,它只是為了區分、彙總、唯一標識不同的類而提出的概念,跟資料夾目錄層次結構是兩回事,我們只是習慣上用資料夾目錄來展示package而已。但package卻不一定非要用過資料夾目錄來展示。

我們可以用下面這段程式碼來進一步說明這個問題

public static void main(String[] args) throws Exception {  
    // 專案中jar包所在物理路徑  
    String jarName = "E:/Work/stsf_skisok_product/WebRoot/WEB-INF/lib/testpackage.jar";  
    JarFile jarFile = new JarFile(jarName);  
    Enumeration<JarEntry> entrys = jarFile.entries();  
    while (entrys.hasMoreElements()) {  
        JarEntry jarEntry = entrys.nextElement();  
        System.out.println(jarEntry.getName());  
    }                 
}  

預設生成的jar包,執行結果如下:
META-INF/MANIFEST.MF  
com/wang/util/DateStyle.class  
com/wang/util/PropertiesUtil$1.class  
com/wang/util/PropertiesUtil.class  
com/wang/util/Week.class  
com/wang/util/DateUtil.class  
com/wang/vo/request/hotel/test/PopularCityRequest.class  
com/wang/vo/request/hotel/test/EconomicsRequest.class  
com/wang/vo/request/hotel/test/HotelProductVouchRequest.class  
com/wang/vo/request/hotel/test/QueryOrderListRequest.class  
com/wang/vo/request/hotel/test/HotelListQueryRequest.class  
com/wang/vo/request/hotel/test/RoomReserveRequest.class  
com/wang/vo/request/hotel/test/HotelOneQueryRequest.class  
com/wang/vo/request/hotel/test/HotelBrandRequest.class  

如果勾選Add directory entries選項生成的jar包,執行結果如下:
META-INF/MANIFEST.MF  
com/  
com/wang/  
com/wang/util/  
com/wang/util/DateStyle.class  
com/wang/util/PropertiesUtil$1.class  
com/wang/util/PropertiesUtil.class  
com/wang/util/Week.class  
com/wang/util/DateUtil.class  
com/wang/vo/  
com/wang/vo/request/  
com/wang/vo/request/hotel/  
com/wang/vo/request/hotel/test/  
com/wang/vo/request/hotel/test/PopularCityRequest.class  
com/wang/vo/request/hotel/test/EconomicsRequest.class  
com/wang/vo/request/hotel/test/HotelProductVouchRequest.class  
com/wang/vo/request/hotel/test/QueryOrderListRequest.class  
com/wang/vo/request/hotel/test/HotelListQueryRequest.class  
com/wang/vo/request/hotel/test/RoomReserveRequest.class  
com/wang/vo/request/hotel/test/HotelOneQueryRequest.class  
com/wang/vo/request/hotel/test/HotelBrandRequest.class  

這樣也就解釋了為何打成jar包後用getResource獲取資源url總是為空的原因了。

相關推薦

myeclipse 生成jar,spring無法掃描bean定義

myeclipse  jar add directory entries 之前,我曾經寫過一篇Java遍歷包中所有類,但經過一名網友提醒發現,只能適用於專案src中的包,當包在jar裡時就無法遍歷jar裡的類。就此我針對程式碼進行了細化,功能得到進一步的完善。 在分

Eclipse生成jarSpring無法掃描bean定義

無論包是在src中還是在jar中,其實根本的思路還是根據給的包域名(如:com.wang.vo.request.hotel.test)定位到包的資源物件。包在src中,我們可以把它當做檔案File來進行處理,因此在src中包是以資料夾的形式來體現的,但在jar中

myeclipse 生成jar操作

 選擇第一個 引用的jar包會整合到專案中去。   選擇第二個 引用的jar包會單獨放在專案根目錄下(推薦)。                    選擇第三個 引用的jar包會單獨放在一個資料夾下,這個資料夾和匯出的jar放在同一目錄下,finish。遇到的問題:(網路來源)為什麼export-->

關於將aop功能封裝成jar,被其他模組依賴,aop功能無法實現的問題(掃描

在開發中,將aop的功能寫到了公共模組後,然後將公共模組封裝成jar包,被其他專案所依賴。但是出現aop功能無法實現,是因為未掃描到該包下的類,需要在引用模組的啟動類中加入掃描的程式碼 @ComponentScan(basePackages = {"xxx.xxx.*"})

spring boot mybatis 打成可執行jar啟動UnsatisfiedDependencyException異常

我的spring boot + mybatis專案在idea裡面執行正常,但釋出測試環境打成可執行jar包後就啟動失敗,提示錯誤如下: [ ERROR] [2018-08-30 17:23:48] org.springframework.boot.SpringApplication [845] - Appl

Spring-boot 打成jar使用外部配置檔案

官網說明 第一種是在jar包的同一目錄下建一個config資料夾,然後把配置檔案放到這個資料夾下;  第二種是直接把配置檔案放到jar包的同級目錄;  第三種在classpath下建一個config資料夾,然後把配置檔案放進去;  第四種是在classpath下直接放配置檔

SpringBoot專案打成jar無法讀取到resource下的檔案

在Springboot專案的resources下添加了一個Excel模板檔案以供客戶端下載 開發環境下通過這種方式讀取檔案 File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "static/

springboot打成jar無法讀取resource資料夾下檔案模板---------------gxy

springboot打成jar包後無法讀取resource資料夾下檔案模板 BufferedInputStream bis = null; OutputStream os = null; Cla

Spring Boot Maven專案生成jar,部署到Linux伺服器執行

Spring Boot生成jar ,本篇只針對於 idea 第一部分 生成jar 1.首先進入“Project Structure” ,之後點選 “Artifacts” 2.點選 + 號,選擇JAR 3.進入選擇 ,最後點選 OK

Spring Boot專案生成jar,並在windows伺服器中註冊成服務,開機啟動

最近工作在windows伺服器上部署 spring boot 的jar包之前都是在linux上執行命令:  nohup java -jar xxx.jar > xxx.log &  現在為了達到跟Linux一樣的效果。最終方案:使用winswwinsw是一個開源

Spring boot的pom.xml配置,正確生成jar

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

解決專案打jar無法獲取配置檔案的路徑問題

今天在開發中做一個java專案,要求讀取配置檔案中的資訊,開始一直寫成絕對路徑,當專案打jar包以後就找不到配置檔案了,後面在網上當了一個方法,問題最後解決了,拿出來跟大家分享一下。 public class SMBConfig {//SMB訊息引數public static String SMB_S

IDEA匯出jar執行報錯 找不到或無法載入主類

  綜上所訴, 我又嘗試在最開始選擇配置的時候,如果選擇extract to the target JAR(提取到目標jar包) 這個選項,那麼對於我這個測試專案就完全沒問題了,生成的test.jar包裡包含MANIFEST.MF檔案,並且這個包裡不會再有其他的jar包了,就沒有問題了

IDEA 生成 jar

bsp .com width 所有 settings nbsp png jar -1 Build -> Build Artifacts -> ... 生成的 jar 包在 out/artifacts 目錄下 生成單一 jar 包: 在項目上右擊 ->

android代碼生成jar

ips 今天 右鍵 編譯 make 技術 名稱 mage .bat 前沿:有時候我們的android項目會有核心算法或代碼,一般這種情況會把算法(cpp文件等)打成so文件,把代碼進行整理打成jar包或aar包;今天我們就來討論怎樣把算法打成so文件,怎樣把關鍵代碼打成ja

java在window下用cmd (javac、jar)命令行模擬Intellij IDEA軟件生成jar

cmd cti 最重要的 ron 路徑 alloc 不可 alt CP @@首先最重要的cmd命令: javac ,jar :使用如下(註意[.]不要輸錯): 1. javac編譯: D:\MyWorkSet\idea_hadoop>javac -d .\out

命令行生成jar

工具 創建 clas 表示 stat 打包工具 命令 int class 1.編寫java代碼,保存為HelloWorld.java package test; public class HelloWorld { public static void main(Strin

使用NetBeans生成jar,並在jar中添加資源

source img 無法 bubuko res 文件 null lean 歸檔文件 在NetBeans中,執行Clean and Build便可得到jar文件 若要在jar中添加資源,先用壓縮軟件打開jar,然後將資源拖進當前歸檔文件即可 使用Class.getResou

【idea】生成Jar

用idea打jar包非常方便 我們先看看例項專案 這個專案裡包括 一個數據檔案,位於’data/data’ 一個自定依賴庫,位於’lib/’下 還有一個主java檔案,位於‘src/MyClass.jar’ (如何新增jar包請訪問Intellij IDEA 新增jar包的三種方式

springboot打成Jar部署至Linux伺服器上

下面主要記錄一下springboot打包成jar包在Linux服務上部署的步驟: 1、通過WinSCP,將相應的Jar檔案,複製到Linux指定目錄下,如/home/ 2、開啟ssh,進入/home目錄下,執行如下命令,進行專案的啟動,此方式為後臺啟動,即使關閉當前視窗,專案還是在執行的,會生成nohu