Java Ant脚本查找给定类名的jar文件?

Java Ant脚本查找给定类名的jar文件?,java,ant,Java,Ant,如何通过ant脚本找到包含特定类的jar名称?试试。这是一个命令行java工具,如果您想通过ant将其集成,应该很容易。这不是ant真正的用途 Ant主要是一个构建工具,它的核心功能就是围绕这一点展开的。是的,它可以用于其他功能,但最好还是按预期用途使用它。在JAR文件中查找类不是它擅长的 在Java中这样做可能会更好。Java提供了打开JAR文件和检查内容的功能。您可以使用这些来查找您要查找的类。或者,使用另一种工具来实现这一点,比如Biju提到的Jarscan。如果确实需要这样做,一种可能有

如何通过ant脚本找到包含特定类的jar名称?

试试。这是一个命令行java工具,如果您想通过ant将其集成,应该很容易。

这不是ant真正的用途

Ant主要是一个构建工具,它的核心功能就是围绕这一点展开的。是的,它可以用于其他功能,但最好还是按预期用途使用它。在JAR文件中查找类不是它擅长的


在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的情况完全不同。