小编Car*_*ala的帖子

来自JUnit的getResourceAsStream

我正在为一个需要在初始化期间加载配置文件的项目创建一个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调用吗?

非常感谢,

普约尔

java junit classloader getresource

13
推荐指数
1
解决办法
8568
查看次数

7z和lzma压缩机有什么区别?

7-Zip声称使用LZMA作为压缩算法.但是,LZMA SDK附带了两个可执行文件,7zr.exe和lzma.exe,它们具有不同的选项/开关,并且产生不同的结果,这些结果是不可互换的,即使它们的大小很小.

所以问题是:这两个处理器之间有什么区别?

7zip lzma

12
推荐指数
1
解决办法
5580
查看次数

Vim:使用多种模式排序

我知道,在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中进行(如果是更好的,如何;-)

非常感谢,问候

regex sorting vim

10
推荐指数
1
解决办法
2199
查看次数

在maven程序集之前替换类文件

我面临一个非常独特的情况,需要一些建议:我正在开发一个项目,这个项目取决于我同一家公司的其他项目,现在我需要对依赖项进行一些修改.我遇到的问题是来自依赖项的源代码已经丢失,所以我唯一拥有的是存储库中的maven依赖项,以及相应的jar文件.最重要的是,Jar文件中的一些类使用JiBX解析器创建,映射一些我没有的XSD文件,结果类是合成的,我发现没有反编译器能够正确处理它们.

所有这一切的唯一好处是我需要更改的类可以被适当地反编译,所以去了以下内容:

  • 我反编译了整个jar文件,最后得到了一些带有空或错误实现方法的类(JiBx).
  • 我注释了错误方法的主体,以获得存根对象,将所需的更改应用于正确的类并重新编译.
  • 我拿了旧的Jar文件,打开它并用新的类手动替换旧类.

最终的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)

resources jar class package maven

7
推荐指数
1
解决办法
4137
查看次数

标签 统计

7zip ×1

class ×1

classloader ×1

getresource ×1

jar ×1

java ×1

junit ×1

lzma ×1

maven ×1

package ×1

regex ×1

resources ×1

sorting ×1

vim ×1