我正在尝试从项目中的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”。
答案 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());