2012-01-28 53 views
0

我試圖從我的項目中的resources導入文件。我指定SOLVER_CONFIGresources的根中獲得solver.xml未從「資源」目錄中檢測到的文件

package in.co.technovia.sudoku; 

import java.util.ArrayList; 
.... 
public class App{ 
    private static final String SOLVER_CONFIG = "/solver.xml"; 
    public static void main(String[] args){ 
    SudokuGenerator sg = new SudokuGenerator(); 
    .... 
    } 

    private static Solver createSolver(){ 

    XmlSolverConfigurer configurer = new XmlSolverConfigurer(); 
     configurer.configure(SOLVER_CONFIG); 
     return configurer.buildSolver(); 
    } 
} 

它應該採取solver.xmlresources根。它工作在this case,但反覆無常的Java神否則下旨爲我的項目:

[email protected]:~/dev/drools/sudoku$ java in.co.technovia.sudoku.AppException in thread "main" java.lang.IllegalArgumentException: The solver configuration (/solver.xml) does not exist. 
    at org.drools.planner.config.XmlSolverConfigurer.configure(XmlSolverConfigurer.java:79) 
    at in.co.technovia.sudoku.App.createSolver(App.java:67) 
    at in.co.technovia.sudoku.App.main(App.java:43) 

問:爲什麼心不是從Java resources檢測文件?


我包括src/main/java/in/co/technovia/sudoku/應用和src/main/resources/目錄和當前的classpath的內容。

[email protected]:~/dev/drools/sudoku$ ls src/main/resources/ 
score.drl score.drl~ solver.xml solver.xml~ 

[email protected]:~/dev/drools/sudoku$ ls src/main/java/in/co/technovia/sudoku/ 
App.class App.java~ helloworld.class helloworld.java~ 
App.java domain  helloworld.java solution 

[email protected]:~/dev/drools/sudoku$ export | grep CLASSPATHdeclare -x 
CLASSPATH=".:/home/jesvin/dev/drools/sudoku/binaries/*:/home/jesvin/dev/drools/sudoku/src/main/java" 

解決方案:作爲khmarbaise在他回答說,這個目錄是爲一個Maven構建。所以要包含目錄,請參閱'https://stackoverflow.com/a/9045680/604511'。

回答

1

您似乎在Maven構建中將它的意圖誤解爲src/main/resources文件夾。

this.getResourceAsStream("/solver.xml")... 

它給你回的InputStream而不是文件對象:該文件夾的src/main /資源被編譯成目標/ classes文件夾中,它表示你可以用在Java應用程序中使用的資源過程中複製。以下內容可用於從中獲取文件,但此方法不適用於類路徑中的JAR,僅適用於文件和目錄。

URL dir_url = ClassLoader.getSystemResource(dir_path); 
// Turn the resource into a File object 
File dir = new File(dir_url.toURI()); 
+0

「這是在Maven構建的意圖」,但[這個項目](https://github.com/diega/drools-planner-poc/tree/master/src/main)我對它的建模似乎並不是一個Maven構建。 – aitchnyu 2012-01-28 13:00:54

+0

是的,資源已經被使用[就像你描述](http://grepcode.com/file/repository.jboss。org/maven2/org.drools.solver/drools-solver-core/5.0.0.M5/org/drools/solver/config /XmlSolverConfigurer.java#XmlSolverConfigurer.configure%28java.lang.String%29)但是如何獲得它指向正確的地方? – aitchnyu 2012-01-28 13:10:32

1

嘗試使用:

private static final String SOLVER_CONFIG = "resources/solver.xml"; 

你添加一個目錄到類路徑中,這一事實並不意味着Java將使用該目錄下找到外部文件。它只意味着它將使用該目錄來查找其中的類。

A solver.xml文件不是類文件。你可能訪問solver.xml通過文件系統相關的類如:

File f = new File("solver.xml"); 

因此該文件需要在文件系統中被發現。如果你使用"/solver.xml",你告訴java打開一個名爲solver.xml的文件,該文件位於根目錄/目錄中。

+0

同樣的錯誤。 – aitchnyu 2012-01-28 11:32:45

+0

嘗試使用解算器文件的abosulte路徑。如'/ tmp/solver.xml'。並嘗試在'SOLVER_CONFIG'變量中反映出來。 – 2012-01-28 11:34:51

+0

Pablo我只會通過'Class.getResourceAsStream(...)'添加關於加載資源的信息。這和你的答案應該足以解決問題。 – 2012-01-28 11:58:30