我正在为一个需要在初始化期间加载配置文件的项目创建一个JUnit TestCase.
此配置文件位于src/main/resources/config文件夹中的项目内,并且在构建maven期间将其放入JAR内的/ config文件夹中.
初始化类,使用以下语句从那里读取文件:
ClassLoader classloader = this.getClass().getClassLoader();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(classLoader.getResourceAsStream("/config/config.xml")));
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我将这个jar部署并执行到应用程序服务器时,它按预期工作,但是,每当我在Eclipse中的JUnit TestCase中运行它时,getResrouceAsStream方法返回null.
考虑到该类是my.package.MyClassTest.java,并且它位于src/test/java/my/package/MyClassTest.java中,我已经尝试将config.xml文件的副本放入以下文件夹中但没有成功:
- src/test/resources/config
- src/test/resources/my/package/config
- src/test/java/my/package/config
Run Code Online (Sandbox Code Playgroud)
我知道在StackOverflow中已经多次询问过类似的问题,但是我发现的所有响应都指的是改变文件的加载方式,虽然更改代码可能是一个选项,但我更愿意找到合适的地方.该文件所以我不需要修改已经在生产环境中工作的东西.
那么,我应该在哪里放置这个文件,以便能够在我的JUnit测试中使用它?
UPDATE
我只是通过对代码进行一些小改动来提出解决方案:我没有使用ClassLoader来获取资源,而是直接使用了类:
Class clazz = this.getClass();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(clazz.getResourceAsStream("/config/config.xml")));
Run Code Online (Sandbox Code Playgroud)
它从src/test/resources/config/config.xml成功读取文件.
但是,这里有一些非常奇怪的东西:Class.getResourceAsStream方法是:
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
Run Code Online (Sandbox Code Playgroud)
如果我调试它,我可以清楚地看到这个getClassLoader0()返回与前一个调用完全相同的对象(相同的id),this.getClass().getResourceAsStream()(我维护,只是为了比较值)! !
这里发生了什么?!
为什么在工作之间插入新方法调用时直接调用方法不起作用?
老实说,我对此非常惊讶.
顺便说一句,我使用的是JUnit 4.10版.可能以某种方式篡改getClassLoader调用吗?
非常感谢,
普约尔
我知道,在vim中,我可以使用正则表达式对文件进行排序,以指示在使用以下方法排序时我想要使用的每行的哪些部分:
:sort 'regex' r
Run Code Online (Sandbox Code Playgroud)
是否可以组合多个表达式?
这里有一个例子:
INPUT:
bar a 2
foo b 1
bar b 1
foo a 2
Run Code Online (Sandbox Code Playgroud)
:sort'[az]'r
foo b 1
bar b 1
bar a 2
foo a 2
Run Code Online (Sandbox Code Playgroud)
排序'[0-9]'r
bar a 2
bar b 1
foo b 1
foo a 2
Run Code Online (Sandbox Code Playgroud)
预期(也许是"喜欢":排序'[AZ] | [0-9]'r?):
bar b 1
bar a 2
foo b 1
foo a 2
Run Code Online (Sandbox Code Playgroud)
请注意,由于那些"a"和"b"打破了数字顺序,所以裸"排序"不起作用
bar a 2
bar b 1
foo a 2
foo b 1
Run Code Online (Sandbox Code Playgroud)
VIM之外的另一种选择也被接受了,但是,为了好奇,我想知道它是否真的可以在VIM中进行(如果是更好的,如何;-)
非常感谢,问候
我面临一个非常独特的情况,需要一些建议:我正在开发一个项目,这个项目取决于我同一家公司的其他项目,现在我需要对依赖项进行一些修改.我遇到的问题是来自依赖项的源代码已经丢失,所以我唯一拥有的是存储库中的maven依赖项,以及相应的jar文件.最重要的是,Jar文件中的一些类使用JiBX解析器创建,映射一些我没有的XSD文件,结果类是合成的,我发现没有反编译器能够正确处理它们.
所有这一切的唯一好处是我需要更改的类可以被适当地反编译,所以去了以下内容:
最终的Jar按预期工作.
现在我的问题是:我可以使用Maven完成所有这些吗?
我们的想法是将JiBX类文件作为资源,并将存根等效项保存为源文件,然后让maven:
你会推荐哪种方法?
UPDATE
我提供了有关依赖项目结构的更多细节:
所有类都在同一个包中:
my.project.domain.JiBX__c_GeneratedObfuscatedClass1.java
my.project.domain.JiBX__c_GeneratedObfuscatedClass2.java
my.project.domain.JiBX__c_GeneratedObfuscatedClass3.java
my.project.domain.CustomizableClass1.java
my.project.domain.CustomizableClass2.java
my.project.domain.CustomizableClass3.java
Run Code Online (Sandbox Code Playgroud)
JiBX类没有作为依赖项正确导入,如果我尝试将任何CustmizableClasses放入项目源中并让JiBX类作为依赖项,编译器会报告缺少的方法.
我也尝试使用Shade插件,但是因为我需要将JiBX类包含到我的源路径中,所以我最终必须从jar依赖包中编译JiBX类并编译CustomizableClasses,但是从jar dep跳过CustomizableClasses并编译JiBX课程.
我觉得它可以工作,但我承认我仍然没有找到这样做的方法.任何线索都会受到欢迎.
更新2(决议)
我在这里解释我是如何使用建议的阴影插件最终管理它的,以防万一其他人需要做同样的事情:
我终于在同一个包中创建了一个反编译类的项目,并将不想被反编译的方法留下了注释掉.
在pom.xml中我添加了以下内容:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>${project.groupId}:${project.artifactId}</include>
<include>TheDamnedProject:WithoutSources</include>
</includes>
</artifactSet>
<filters>
<filter>
<artifact>TheDamnedProject:WithoutSources</artifact>
<includes>
<!-- These classes will be taken directly from dependency JAR -->
<include>my/package/ClassWhichCouldNotBeDecompiled1.class</include>
<include>my/package/ClassWhichCouldNotBeDecompiled2.class</include>
<include>my/package/ClassWhichCouldNotBeDecompiled3.class</include>
<include>my/package/ClassWhichCouldNotBeDecompiled4.class</include>
</includes>
</filter>
<filter>
<artifact>${project.groupId}:${project.artifactId}</artifact>
<excludes>
<!-- These classes will be overridden by the …Run Code Online (Sandbox Code Playgroud)