2011-01-20 33 views
2

如何通過ant腳本找到包含特定類的jar的名稱?Ant腳本查找給定類名的jar文件?

+0

是與.jar文件的名稱相同的類的名稱? – Grammin 2011-01-20 20:09:54

+0

Nope ..它的不同......所有的罐子都在一個其位置已知的目錄中。我嘗試了使用shell腳本,但它花費很多時間來搜索。:( – scorpion 2011-01-20 20:13:47

+0

很長時間來搜索?我給你一個基於shell腳本的答案,我很樂意看到一個解決方案,以更快地解決你的問題。 – 2011-01-20 23:47:14

回答

1

嘗試jarscan。這是一個命令行的java工具,如果你想通過ant集成它也應該很容易。

0

這不是真正的螞蟻。

Ant主要是一個構建工具,它的核心功能圍繞着這一點。是的,它可以用於其他功能,但仍然最好使用它的用途。在JAR文件中尋找類並不是它擅長的。

在Java中這樣做可能會更好。 Java提供了打開JAR文件並檢查內容的功能。你可以使用這些來找到你正在尋找的課程。或者,使用另一個旨在實現這一目標的工具,比如Biju提到的Jarscan。

0

如果你真的需要做到這一點,一種方法可能工作是遍歷所有的JAR文件,並通過每一個到available任務作爲唯一classpath路徑元素。您感興趣的課程將用於classname屬性。

編輯:既然這聽起來像你現在的娛樂無螞蟻的解決方案,這裏的發現,我的類代碼的變化:

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]); 
     } 
    } 
} 
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.

0

我同意rfeak這不是ANT的設計目的。話雖如此,確定如何解決丟失的類依賴關係是非常令人沮喪的......

我使用findjar網站。它索引了大部分可用的開源庫。

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> 

我希望這能回答你的問題。

Maarten