Java Ant脚本查找给定类名的jar文件?
如何通过ant脚本找到包含特定类的jar名称?试试。这是一个命令行java工具,如果您想通过ant将其集成,应该很容易。这不是ant真正的用途 Ant主要是一个构建工具,它的核心功能就是围绕这一点展开的。是的,它可以用于其他功能,但最好还是按预期用途使用它。在JAR文件中查找类不是它擅长的Java Ant脚本查找给定类名的jar文件?,java,ant,Java,Ant,如何通过ant脚本找到包含特定类的jar名称?试试。这是一个命令行java工具,如果您想通过ant将其集成,应该很容易。这不是ant真正的用途 Ant主要是一个构建工具,它的核心功能就是围绕这一点展开的。是的,它可以用于其他功能,但最好还是按预期用途使用它。在JAR文件中查找类不是它擅长的 在Java中这样做可能会更好。Java提供了打开JAR文件和检查内容的功能。您可以使用这些来查找您要查找的类。或者,使用另一种工具来实现这一点,比如Biju提到的Jarscan。如果确实需要这样做,一种可能有
在Java中这样做可能会更好。Java提供了打开JAR文件和检查内容的功能。您可以使用这些来查找您要查找的类。或者,使用另一种工具来实现这一点,比如Biju提到的Jarscan。如果确实需要这样做,一种可能有效的方法是循环遍历所有JAR文件,并将每个JAR文件作为一个
类路径
路径元素传递给可用的任务。您感兴趣的类将用于classname
属性
编辑:因为听起来您现在正在使用非Ant解决方案,下面是find my类代码的一个变体:
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);
}
}
import java.net.URL;
公共类查找器{
公共静态void main(字符串[]args)引发ClassNotFoundException{
Class c=Class.forName(args[0]);
URL=c.getResource(c.getSimpleName()+“.class”);
System.out.println(““+args[0]+”的位置:“+url”);
}
}
在Java6中,您可以使用类路径通配符(请参阅),因此应该很容易包含JAR目录,并查看它的速度
编辑2:如果你想找到多个地点
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]);
}
}
}
import java.io.IOException;
导入java.net.JarURLConnection;
导入java.net.URL;
导入java.net.URLConnection;
导入java.util.Enumeration;
公共类查找器{
公共静态void main(字符串[]args)引发IOException{
字符串classResourceName=args[0].replaceAll(“\\.”,“/”+“.class”;
ClassLoader=ClassFinder.class.getClassLoader();
枚举classResources=(loader==null)?ClassLoader.getSystemResources(classResourceName):loader.getResources(classResourceName);
if(classResources.hasMoreElements()){
System.out.println(““+args[0]+”的位置:”;
while(classResources.hasMoreElements()){
URL=classResources.nextElement();
URLConnection conn=url.openConnection();
字符串loc=(JarURLConnection的conn instanceof)?((JarURLConnection)conn.getJarFile().getName():url.toString();
系统输出打印LN(loc);
}
}否则{
System.out.println(“未找到“+args[0]);
}
}
}
我认为用一行(好的,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上执行此操作,抱歉。抱歉没有回答蚂蚁的问题,但其他人已经回答了。希望这能有所帮助,-M.S.我同意rfeak这不是ANT设计的目的。话虽如此,确定如何解决缺少的类依赖关系可能非常令人沮丧
我使用这个网站。它索引了大多数可用的开源库 我们使用下面的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>
包含主类的Jar文件:${Jar.file}
我希望这能回答你的问题
Maarten类的名称与.jar文件的名称相同吗?不,不同的是…所有jar都位于一个位置已知的目录中。我尝试使用shell脚本,但搜索时间很长:(搜索时间很长?我在下面给了你一个基于shell脚本的答案,我希望看到一个更快地解决你的问题的解决方案。这似乎对我不起作用,因为我不能使用第三方jar finder软件??必须有一些JAVA API用于相同的??或ant命令?你不知道这些信息用于什么。在我的情况下,我们使用它生成webstart应用程序的JNLP。是的:我们需要知道哪个jar包含某个类,是的:我们确实需要这些信息来构建我们的应用程序。在这种情况下,我假设您在将类放入jar之前知道该类的位置。这与在jar中接收大量jar是完全不同的nd试图找出某个特定类的加载位置。换句话说,您的情况似乎与OP的情况完全不同。