未从`resources`目录中检测到的文件

时间:2012-01-28 11:26:51

标签: java

我正在尝试从项目中的resources导入文件。我从SOLVER_CONFIG的根目录中指定了solver.xml以接收resources

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.xml的根开始resources。它适用于this case,但反复无常的Java神为我的项目颁布了法令:

jesvin@Jesvin-Technovia:~/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/目录以及当前类路径的内容。

jesvin@Jesvin-Technovia:~/dev/drools/sudoku$ ls src/main/resources/
score.drl  score.drl~  solver.xml  solver.xml~

jesvin@Jesvin-Technovia:~/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

jesvin@Jesvin-Technovia:~/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”。

2 个答案:

答案 0 :(得分:1)

尝试使用:

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

向类路径添加目录这一事实并不意味着Java将使用该目录来查找外部文件。它只意味着它将使用该目录来查找其中的类。

solver.xml文件不是类文件。您可能正在通过与文件系统相关的类访问solver.xml,例如:

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

因此需要在文件系统中找到该文件。如果使用"/solver.xml",则告诉java打开名为solver.xml的文件,该文件位于根/目录中。

答案 1 :(得分:1)

您似乎错误地将文件夹src / main / resources误认为是Maven构建中的意图。在构建期间将文件夹src / main / resources复制到target / classes文件夹中,该文件夹表示可以使用以下内容在java应用程序中使用的资源:

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

它会返回一个InputStream而不是File对象。以下内容可用于从中获取文件,但此方法不适用于类路径中的JAR,仅适用于文件和目录。

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