2013-05-21 19 views
1

我有一個簡單的項目,它依賴於jar文件。 Jar文件具有帶構造函數的單個類,其中包含props.xml的路徑。如果我希望它通過命令行將項目作爲jar文件運行,某些屬性文件的路徑應該如何顯示

這是項目結構:

這裏是主類:enter image description here

import com.file.reader.FileReader; 


public class SimpleExample { 
public static void main(String[]args){ 
FileReader rd = new FileReader("props.xml"); 
} 
} 

這裏是FileReader.java

package com.file.reader; 

import java.io.File; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 

public class FileReader { 


public FileReader(String fileName){ 
    try { 

     File file = new File(fileName); 

     DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance() 
           .newDocumentBuilder(); 

     Document doc = dBuilder.parse(file); 

     System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); 

     if (doc.hasChildNodes()) { 

      System.err.println((doc.getChildNodes())); 

     } 

     } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     } 

} 
} 

這基本上讀取XML文件。

FileReader.java是一個正在我的項目中訪問的jar文件。當我在蝕運行我看到下面的輸出:

[#document: null] 
Root element :company 

但是,當我導出DummyFilePath如jar文件,並試圖從命令行運行。

我看到的是被拋出的錯誤:

C:\Users\javaMan\props.xml (The system cannot find the file specified) 

從命令行我運行

Java -jar DummyFilePath.jar 

我怎樣才能讓它通過命令行運行

編輯

經過檢查一些鏈接的問題,我嘗試了不同的方式:

我將props.xml移動到src文件夾。

然後我改變了SimpleExample.java如下:

import java.io.File; 
import java.net.URL; 

    import com.file.reader.FileReader; 

public class SimpleExample { 

public static void main(String[] args) { 
    SimpleExample se = new SimpleExample(); 
    System.err.println(se.getPath()); 
    FileReader rd = new FileReader(se.getPath()); 
} 
public String getPath(){ 
    URL url1 = getClass().getClassLoader().getResource("props.xml"); 
    File f = new File(url1.getFile()); 
    return f.getAbsolutePath(); 
} 
} 

所以,當我在Eclipse中運行,我看到下面這是很好的:

C:\Users\javaMan\Perforce\DummyFilePath\bin\props.xml 
[#document: null] 
Root element :company 

當我運行相同DummyFilePath.jar我看到下面的錯誤:

C:\Users\javaMan\Desktop>java -jar "C:\Users\javaMan\Desktop\DummyFilePath.jar" 
C:\Users\javaMan\Desktop\file:\C:\Users\javaMan\Desktop\DummyFilePath.jar!\props.xml 
C:\Users\javaMan\Desktop\file:\C:\Users\javaMan\Desktop\DummyFilePath.jar!\props.xml (The filename, directory name, or volume label syntax is incorrect) 
+1

從命令行運行時,您處於哪個目錄?當你打開一個沒有完整路徑的文件時,它將使用當前的工作目錄來查找它。 –

+1

是jar中的屬性文件嗎? –

+0

我複製了jar文件c:/ users/javaMan目錄 – javaMan

回答

1

既然你只給了File類文件名(在直接通過你的構造函數),它假定你的意思是它是一個相對路徑(相對於當前目錄)。換句話說,它相當於.\props.xml,並且由於命令行上的當前目錄是C:\Users\javaMan\(在執行Java -jar DummyFilePath.jar時,您可以在命令提示符的左側看到它),它看起來就在那裏。您可能需要指定絕對文件路徑props.xml

例如,如果props.xmlC:\Users\javaMan\someotherfolder中,絕對路徑(在Windows中至少)將是C:\Users\javaMan\someotherfolder\props.xml

+0

但我不能給絕對路徑,因爲它會在其他機器上使用 – javaMan

+0

然後,您需要將其作爲參數或確保它位於運行程序的任何機器的當前目錄中。是否值得把它作爲參數的麻煩取決於誰將使用你的程序。請注意,例如,如果您的程序在'C:\ temp \ javaManProgram'中,並且這不是當前目錄,則此代碼將失敗。換句話說,如果用戶執行此操作,它將不起作用:'C:\ temp> java -jar。\ javaManProgram \ DummyFilePath.jar'和'props.xml'位於'C:\ temp \ javaManProgram'中程序。 ('C:\ temp>'是提示符,它是當前目錄。) – jpmc26

0

導出時請不要忘記添加資源。他們並不總是被添加,一些建設者過濾資源。

+0

當我導出props.xml被選中它。我認爲它必須處理相對路徑。對於eclipse,它將當前路徑作爲項目目錄。但是對於jar文件,它將當前路徑作爲jar文件所在的路徑。所以它正在jar文件所在的文件夾中尋找props.xml並且失敗 – javaMan

+1

@javaMan當從命令提示符執行jar文件時,它應該使用命令提示符的當前目錄作爲當前目錄。當你的命令提示符的當前目錄不是你的jar文件時,嘗試執行你的jar文件。 – jpmc26

+0

我位於jar文件所在的目錄中。它仍然顯示相同的錯誤。 – javaMan

相關問題