Ant脚本在给定类名的情况下查找jar文件?

时间:2011-01-20 20:03:26

标签: java ant

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

6 个答案:

答案 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网站。它为大多数可用的开源库编制索引。