如何通过ant脚本找到包含特定类的jar名称?
答案 0 :(得分:3)
我们使用以下Ant代码来查找包含主类的jar。它需要Ant 1.8 +。
<whichresource class="${main.class}" property="main.class.url">
<classpath>
<fileset dir="${jar.dir}" includes="*.jar" />
</classpath>
</whichresource>
<pathconvert property="jar.file">
<url url="${main.class.url}" />
<regexpmapper from="jar:file:/(.*)!.*" to="\1" />
</pathconvert>
<echo>Jar file containing main class: ${jar.file}</echo>
我希望这能回答你的问题。
马腾
答案 1 :(得分:1)
试试jarscan。它是一个命令行java工具,如果你想通过ant整合它应该很容易。
答案 2 :(得分:1)
我认为通过1行(ok,5行)C-shell脚本可以更好地解决这个问题。假设您正在尝试在某个目录中查找包含特定文件的jar文件列表。在你的csh提示符下试试这个:
% cd directory_where_your_jar_files_reside
% set f2Search = filename_you_are_looking_for
% foreach jarFile (*.jar)
? (jar tvf $jarFile | grep $f2Search > /dev/null) || echo $jarFile
? end
如果需要,您显然可以将输出连接到其他文件。这是一个Unix解决方案,不知道如何在Windows上执行此操作,抱歉。抱歉没有回答Ant问题,但其他人已经回答了这个问题。希望这会有所帮助, - M.S。
答案 3 :(得分:0)
这不是Ant的用途。
Ant主要是一个构建工具,它的核心功能围绕着它。是的,它可以用于其他功能,但它仍然最好使用它的目的。在JAR文件中查找类并不是它擅长的。
在Java中执行此操作可能会更好。 Java提供了打开JAR文件和检查内容的功能。您可以使用它们来查找您要查找的课程。或者,使用其他工具,例如Biju提到的Jarscan。
答案 4 :(得分:0)
如果您确实需要这样做,可能有一种方法是循环遍历所有JAR文件,并将每个JAR文件作为单独的available
路径元素传递给classpath
任务。您感兴趣的课程将用于classname
属性。
编辑:因为听起来你现在正在娱乐非Ant解决方案,这里是find-my-class代码的变体:
import java.net.URL;
public class ClassFinder {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> c = Class.forName(args[0]);
URL url = c.getResource(c.getSimpleName() + ".class");
System.out.println("location of " + args[0] + ": " + url);
}
}
使用Java 6,您可以使用类路径通配符(请参阅"Understanding class path wildcards"),因此应该很容易包含您的JAR目录并查看它的速度。
Edit2:如果你想找到多个地点......
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
public class ClassFinder {
public static void main(String[] args) throws IOException {
String classResourceName = args[0].replaceAll("\\.", "/") + ".class";
ClassLoader loader = ClassFinder.class.getClassLoader();
Enumeration<URL> classResources = (loader == null) ? ClassLoader.getSystemResources(classResourceName) : loader.getResources(classResourceName);
if (classResources.hasMoreElements()) {
System.out.println("Locations of " + args[0] + ":");
while (classResources.hasMoreElements()) {
URL url = classResources.nextElement();
URLConnection conn = url.openConnection();
String loc = (conn instanceof JarURLConnection) ? ((JarURLConnection)conn).getJarFile().getName() : url.toString();
System.out.println(loc);
}
} else {
System.out.println("No locations found for " + args[0]);
}
}
}
答案 5 :(得分:0)
我同意 rfeak 这不是ANT的设计目标。话虽如此,确定如何解决缺少的类依赖关系确实令人沮丧.......
我使用findjar网站。它为大多数可用的开源库编制索引。