我有几个小时的问题,我尝试了我在教程中找到的所有解决方案。
这很简单:我无法访问资源文件。我尝试打开我放入src/main/resources
和src/test/resources
的文件。
我有一个简单的Java项目,我使用带有Eclipse作为IDE的Maven和m2e插件。
我想使用Maven的资源过滤,具有不同的配置文件,并且我的POM.xml
:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<debug>false</debug>
<optimize>true</optimize>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<filters>
<filter>src/main/filters/${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>LOCAL</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<env>local</env>
</properties>
</profile>
</profiles>
我在src / java / test中做了一个简单的测试:
@Test
public void testOpenResourceFile() {
File testf=new File("/test.txt");
assertTrue(testf.exists());
}
所以,在Eclipse中,我运行(在我的项目文件夹中,在包视图中):
使用env:LOCAL
在测试中,我做:运行为&gt; Junit测试案例。 但它失败了...... 我查看了Maven生成的target / test-classes目录,文件test.txt就在那里。
我在项目编译期间是否错过了一些步骤,或者我的配置是否有问题?
编辑:
我也尝试使用File("test.txt")
和File("../test.txt")
。
答案 0 :(得分:40)
在我看来,你的问题是
File testf = new File( "/test.txt" );
那是在计算机文件系统的根目录下查找名为test.txt
的文件。您想要的是资源树的根,您可以使用getResource
方法获得:
File testf = new File( this.getClass().getResource( "/test.txt" ).toURI() );
或者,在静态上下文中,使用包含类的名称:
File testf = new File( MyClass.class.getResource( "/test.txt" ).toURI() );
当然,您需要为该示例添加错误处理。
答案 1 :(得分:5)
我遇到了同样的问题,只需确保“text.txt”文件位于测试项目的资源文件夹(src / test / resources / text.txt)中,而不是在任何其他资源文件夹中。 此外,您应该从资源文件夹中检索文件,如下所示:
this.getClass().getClassLoader().getResource("text.txt").getFile();
如果仍然无效,请尝试在useSystemClassLoader
中将maven-surefire-plugin
从pom.xml
设置为false。
http://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html
答案 2 :(得分:3)
检查pom.xml中的<build>
标记,它应该是这样的,遇到同样的问题,并在<resources>
中为我添加<build>
标记。
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
答案 3 :(得分:0)
我为这项工作制作了这个方法:
public static String getPropaccess(String key){
String value="";
Properties configFile = new Properties();
try {
configFile.load(Propaccess.class.getClassLoader().getResourceAsStream("test/resources/config.properties"));
value = configFile.getProperty(key);
return value;
} catch (IOException e) {
e.printStackTrace();
}
return value;
}