1. 程式人生 > >jar包讀取資原始檔報錯:找不到資原始檔(No such file or directory)

jar包讀取資原始檔報錯:找不到資原始檔(No such file or directory)

1、遇到問題

(1)Maven專案開發階段正常執行,Java程式可以讀取配置檔案

public class Main {

    public static void main(String[] args) throws Exception {

        Main.readFile("resources/sharepointApp.xml");
    }

    public static byte[] readFile(String fileName) throws Exception {
        String path = SharepointApp.class.getClassLoader().getResource(fileName).getPath();
        System.out
.println(path); File file = new File(path); byte[] buf = new byte[(int) file.length()]; InputStream input=new FileInputStream(fileName); input.read(buf); input.close(); return buf; } }

(2)但是,Maven專案打成jar包後,放到伺服器上執行時,卻報錯,找不到配置檔案。

[[email protected]
~]# java -jar webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar file:/root/webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/resources/sharepointApp.xml Exception in thread "main" java.io.FileNotFoundException: file:/root/webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/resources/sharepointApp.xml (No such file or
directory) at java.io.FileInputStream.open0(Native Method) at java.io.FileInputStream.open(FileInputStream.java:195) at java.io.FileInputStream.<init>(FileInputStream.java:138) at java.io.FileInputStream.<init>(FileInputStream.java:93) at com.cntaiping.tpa.webservice.SharepointApp.readFile(SharepointApp.java:53) at com.cntaiping.tpa.webservice.SharepointApp.sendSms(SharepointApp.java:30) at Main.main(Main.java:22) [[email protected] ~]#

(3)檢視jar結構,對應配置檔案存在。

[[email protected] ~]# jar tf webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar
。。。
DownloadDemo.class
Main.class
META-INF/maven/cn.hadron/webservice/pom.properties
META-INF/maven/cn.hadron/webservice/pom.xml
resources/a.xml
resources/result.xml
resources/sharepoint.xml
resources/sharepointApp.xml
resources/table.xml
Test.class
META-INF/maven/commons-io/
META-INF/maven/commons-codec/
META-INF/maven/commons-codec/commons-codec/
META-INF/maven/commons-io/commons-io/
META-INF/maven/commons-logging/
META-INF/maven/com.github.virtuald/
META-INF/maven/com.github.virtuald/curvesapi/
META-INF/maven/commons-logging/commons-logging/
[[email protected] ~]#

2、問題分析

由上面執行jar包輸出/root/webservice-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/resources/sharepointApp.xml可知,該值是我們通過自定義方法readFile()讀取的檔案路徑,顯然這個值不是一般意義上的URL地址。所以jar包中的類原始碼用File f=new File(專案內地址)的形式,是不可能定位到檔案資源的。

3、解決辦法

jar中資源有其專門的URL形式:jar:<url>!/{entry}
可以通過Class類的getResourceAsStream()方法來獲取資原始檔輸入流方式讀取檔案。

public class FileUtil {
    /**
     * 讀取配置檔案
     * @return
     */
    public static byte[] readConfigFile(String cfgFile) {
        try {
            InputStream in=FileUtil.class.getClassLoader().getResource(cfgFile).openStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(in));
            StringBuilder sb=new StringBuilder();        
            String line="";
            while((line=br.readLine())!=null) {
                sb.append(line);
            }
            return sb.toString().getBytes();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    //省略其他的方法

    //主方法
    public static void main(String[] args) throws IOException {
         byte[] buf = FileUtil.readConfigFile("resources/sharepointApp.xml");

    }
}

相關推薦

jar讀取原始檔到資原始檔(No such file or directory)

1、遇到問題 (1)Maven專案開發階段正常執行,Java程式可以讀取配置檔案 public class Main { public static void main(String[] args) throws Exception {

inux指令碼 /bin/bash^M: bad interpreter: No such file or directory 的解決辦法

問題描述: 執行初始化指令碼的時候遇到一個很奇怪的錯誤,老是提示檔案或目錄找不到. 開啟指令碼反覆檢查,發現路徑都是對的 然後google了一下發現原來是我的檔案格式寫錯了,在windows下用檔案編輯器編輯的預設格式是dos 解決辦法: 在linux下需要把格式改為unix,這

nginx 啟動“var/run/nginx/nginx.pid" no such file or directory解決方法

        今天剛搭建的nginx伺服器啟動時,報錯“var/run/nginx/nginx.pid" no such file or directory,按照他的意思我在var/run/新建了一個資料夾nginx,重新啟動,啟動成功。 但是當我虛擬機器重啟後依然報錯“

【node】- npm install時報npm WARN enoent ENOENT: no such file or directory

npm install -g koa 時報錯如下所示: npm WARN enoent ENOENT: no such file or directory 專案目錄中沒有package.json。 解

Linux安裝apache時 apr解決 rm: cannot remove `libtoolT': No such file or directory

在configure裡面 RM='$RM  -f'   這裡的$RM後面一定有一個空格。 如果後面沒有空格,直接連線減號,就依 然會報錯。把RM='$RM'改為RM='$RM  -f' 注意,此檔案下載到本地修改在上傳會報錯。建議用VI修改

c3p0的jar載入正常,到ComboPooledDataSource

八月 29, 2017 6:35:33 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh INFO: Refreshing org[email 

Yum[Errno 5] [Errno 2] No such file or directory

python Yum yum安裝軟件時,可以連接yum 倉庫,但是下載安裝時失敗,報錯如下 root@pts/0 # yum install httpd 已加載插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile

解決 Boost安裝fatal error: bzlib.h: No such file or directory 問題

++ gpo sku fat .cpp post src lib thread 參考: How to install all the boost development libraries? 解決 Boost安裝:fatal error: bzlib.h: No such

hadoop/bin/bash: /bin/java: No such file or directory

Stack trace: ExitCodeException exitCode=127 In HADOOP_HOME/libexec/hadoop-config.sh look for the if condition below # Attempt to set JAVA_H

Redis叢集/usr/bin/env: ruby: No such file or directory

問題現象 執行建立叢集命令: ./redis-trib.rb create --replicas 1 192.168.101.3:7001 192.168.101.3:7002 192.168.101.3:70

linux Ubuntu C++“fatal error: iostream.h: No such file or directory

所以,新的標準是:#include <iostream>  //標準輸入輸出流 using namespace std; (因為iostream宣告在std中,故而要加上這句,除非你不用庫函式,否則錯誤); 很多編譯器都同時支援這兩種標頭檔案形式,更好的當然是標準標頭檔案。至於為什麼不廢除非標準

tesseract的編譯安裝 tesseract編譯錯誤fatal error: allheaders.h: No such file or directory

    需要安裝: <span style="font-family:'Microsoft YaHei';font-size:14px;">apt-get install autoconfapt-get install automakeapt-get install li

專案新匯入jar之後,執行類沒有找到異常(java.lang.ClassNotFoundException)

在專案需要讀取一個.xlxs型別的Excel檔案,因為之前一直讀取的是.xls檔案,所以這次在網上新下載了一些jar包,然後更改了程式之後,寫了個demo已經沒問題了。 但是....!!!!!!!!! 當我把程式部署在tomcat下時,執行就出錯了。。。 java.lan

iptablesCouldn't load target `accept':/lib64/iptables/libipt_accept.so: cannot open shared object file: No such file or directory

大寫 obj direct 規則 lib not blog acc get 語句:iptables -A INPUT -s 134.192.204.235 -p TCP --dport 11211 -j accept 報錯:Couldn‘t load target `acc

php-fpm啟動libgearman.so.8: No such file or directory in Unknown on line 0

php 報錯 php-fpm 從一臺服務器上拷貝php-fpm程序到另一臺後啟動提示錯誤:/etc/init.d/php-fpm-5.4 start Starting php-fpm [27-Jul-2017 11:31:39] NOTICE: PHP message: PHP Warning:

shell文件管理jenkins構建過程---window環境下到shell文件

文件 jenkins cnblogs 技術 bsp logs -- nbsp alt window環境下報錯:找不到shell文件。查看jenkins本地文件,可以查看到shell文件; 檢查job配置: 發現使用的是Execute shell; 這個項目只能在l

TensorFlow安裝之後導入libcudnn.so.6:cannot open sharedobject file: No such file or directory

-a ring share 環境 .net str ubunt dir 附件 轉載自:http://blog.csdn.net/silent56_th/article/details/77587792 系統環境:Ubuntu16.04 + GTX1060 目的:配置一下py

c++ include包含工程目錄下的.h檔案,fatal error C1083: 無法開啟包括檔案:“Sales_item.h”: No such file or directory

背景:刷c++primer的題目,將下載的某個標頭檔案拖拽到自己建立的工程目錄下,在自己新建的原始檔中include包含時,報無法開啟檔案 明明有檔案 為什麼說無法開啟呢 於是到本地的工程目錄中開啟一看,果然沒有這個檔案 說明通過滑鼠拖拽檔案進入到工程樹上面,檔案並沒

mac終端下執行java檔案到或無法載入主類

由面試題出來的 為了顯示 myStr = 23 這樣的結果,寫出在控制檯輸入的命令 public class MyClass { public static void main(String args[]) { String s1 = args[0]; String s2 = args[

pip 安裝-bash: /home/ubuntu/.local/bin/pip: No such file or directory

which pip     /usr/local/bin/pip pip     -su: /usr/bin/pip: No such file or directory type pip