java:获取正确的资源

标签 java resources

我有一个库 foo.jar,它包含一个 svnversion.properties 文件(就像 svnversion=12345M 或其他)和以下是 SVNVersion 类 中的静态方法:

public static SVNVersion fromString(String s) { ... }
public static SVNVersion fromResources(Class<?> cl) {
    ResourceBundle svnversionResource = ResourceBundle.getBundle(
        "svnversion", Locale.getDefault(), cl.getClassLoader());
    if (svnversionResource.containsKey("svnversion"))
    {
        String svnv = svnversionResource.getString("svnversion");
        return fromString(svnv);
    }
    else
    {
        return null;
    }
}

我还有一个包含 svnversion.properties 文件的库 bar.jar(假设它包含 svnversion=789) .

但是,当我在 bar.jar 中的 class SomeClassInBarJar 中运行以下命令时:

SVNVersion vfoo = SVNVersion.fromResources(SVNVersion.class);
SVNVersion vbar = SVNVersion.fromResources(SomeClassInBarJar.class);

然后打印结果,我看到 789 两次。显然我做的不对。如何在包含给定类的 jar 文件的根目录中获取正确的 svnversion.properties 文件? (假设它在那里)


编辑:我刚试过

InputStream is = cl.getResourceAsStream("/svnversion.properties");

同样的问题。我似乎只能访问主 jar 文件的 /svnversion.properties 而不是库的 /svnversion.properties

最佳答案

您显然不能使用这种方法,因为无论出现什么 svnversion.properties 文件,都将始终使用类加载器。这与您在类中看到的行为相同:如果类路径上有两个同名的类,则使用最先出现的类。

一个(复杂的)方法是找出一个类属于哪个 jar,然后在那个 jar 中检索 svnversion.properties:

public static JarFile getJarFile(Class<?> cl) {
    URL classUrl = cl.getResource(cl.getSimpleName() + ".class");
    if (classUrl != null) {
        try {
            URLConnection conn = classUrl.openConnection();
            if (conn instanceof JarURLConnection) {
                JarURLConnection connection = (JarURLConnection) conn;
                return connection.getJarFile();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    return null;
}

public static SVNVersion fromResources(Class<?> cl) {
    JarFile jarFile = getJarFile(cl);
    ZipEntry entry = jarFile.getEntry("svnversion.properties");
    Properties props = new Properties();
    try {
        props.load(jarFile.getInputStream(entry));
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

    if (props.containsKey("svnversion")) {
        String svnv = props.getProperty("svnversion");
        return fromString(svnv);
    } else {
        return null;
    }
}

这就是为什么,恕我直言,您最好将 svn 版本号本身作为最终静态变量存储在类中(并使用 svn $Revision$ 关键字)。

关于java:获取正确的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4694501/

相关文章:

java - 针对 XSD 的 xml 验证 : Invalid content was found starting with element xxx

java - 编译一个 groovy 脚本及其所有由 gradle 管理的依赖项,然后通过命令行将其作为独立应用程序运行

java - 实现连接池 : Java

java - Eclipse 从资源读取文件 NullPointerException

resources - 将单个文件添加到Gradle资源

ios - 如何为 Xcode 项目添加音效?

jsf-2 - background-image: url ("") 在 CSS h:outputStylesheet 没有加载

java - 如何通过 netBeans 访问 SceneBuilder 2 示例

Android:在字符串、SpannedStrings 和 Spannablestrings 之间进行转换

java - Micronaut 中的异常处理