我已尝试过多种方法在单元测试中从正确的jar访问清单。 我遇到的问题是它似乎正在读取它所涉及的第一个jar文件,而不是我的类。 这是我最近的尝试
InputStream is = Test.class.getResourceAsStream("/META-INF/MANIFEST.MF");
try {
if (is == null) {
System.out.println("null no input stream");
} else {
Manifest manifest = new Manifest(is);
Attributes attributes = manifest.getMainAttributes();
v = attributes.getValue("Test");
System.out.println("Test="+v);
v = attributes.getValue("Created-by");
System.out.println("By="+v);
}
} catch (IOException e) {
System.out.println("error");
} finally {
if (is != null) {
is.close();
}
}
这些是结果
Test=null
By=1.6.0_18 (Sun Microsystems Inc.)
我要使用的MANIFEST.MF
有一个Test
的值,所以我知道这是读错了文件
有谁知道我如何指定包含要使用的单元测试的清单文件的jar?
答案 0 :(得分:2)
这就是我想出来的.....注意用您的类/对象替换HTMLDocumen
t。
HTMLDocument htmlDoc = new HTMLDocument();
try
{
JarFile jarfile = new JarFile(htmlDoc.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
// Get the manifest
Manifest manifest = jarfile.getManifest();
Map<String,Attributes> msa = manifest.getEntries();
for (String key : msa.keySet())
{
System.out.println("KEY: " + key);
Attributes a = msa.get(key);
for (Object k : a.keySet())
{
System.out.println(k + " - " + a.get(k));
}
}
}
catch (IOException e)
{
System.out.println("error");
}
答案 1 :(得分:1)
你可以试试这个:
URLClassLoader classLoader = (URLClassLoader) getClass().getClassLoader();
try {
URL url = classLoader.findResource("META-INF/MANIFEST.MF");
Manifest manifest = new Manifest(url.openStream());
// add your code
...
} catch (IOException E) {
// handle exception
}
答案 2 :(得分:1)
您可以通过以下方式访问包含您班级的jar:
InputStream in = MyClass
.class
.getProtectionDomain()
.getCodeSource()
.getLocation()
.openStream();
我在代码中更改了这一行并获得了相同的结果,you might want to walk and read the whole jar your self直到找到清单文件然后从那里读取它。
答案 3 :(得分:0)
&#34;测试&#34; 不是main attribute。
尝试getEntries()并在那里查找自定义属性。
答案 4 :(得分:0)
这是我最终使用的方法......
String path = Test.class.getProtectionDomain()
.getCodeSource().getLocation().getPath();
path = path.replace("classes/", "");
URL url = null;
try {
url = new URL("jar:file:"+path+"test.jar!/");
JarURLConnection jarConnection = null;
try {
jarConnection = (JarURLConnection)url.openConnection();
Manifest manifest = jarConnection.getManifest();
java.util.jar.Attributes manifestItem = manifest.getMainAttributes();
System.out.println(manifestItem.getValue("Test"));
System.out.println(manifestItem.getValue("Implementation-Version"));
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
} catch (MalformedURLException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
它非常脏,所有的路径操作和jar名称的硬编码...... 这有关系吗?再次感谢你!