我有一个库 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/