0

だからここにあります:クラスのドット定義のパッケージ名(例:com.this.package)をスキャンし、それらをリストに追加するクラスがあります。興味深いのは、IDE で作業しているときは正常に動作しますが、プロジェクトを実行可能な jar ファイルにエクスポートすると、必要な依存関係がすべて含まれているため、クラスが見つかりません。

コードは次のようになります。

private void discoverTestCases(String packageName) throws ClassNotFoundException, IOException {
System.out.println("2");
    ClassLoader classLoader = Thread.currentThread()
            .getContextClassLoader();
    System.out.println("3");
    String path = packageName.replace('.', '/');
    System.out.println("4"+ path);
    Enumeration<URL> resources = classLoader.getResources(path);

    System.out.println("5");
    List<File> dirs = new ArrayList<File>();

    while (resources.hasMoreElements()) {
        URL  resource = resources.nextElement();
        System.out.println(resource.getFile());
        System.out.println(resource.getPath());
        dirs.add(new File(resource.getFile()));
    }

    List<Class> classes = new ArrayList<Class>();

    for (File directory : dirs) {
        classes.addAll(findClasses(directory, packageName));
    }

getTestableClasses(classes);

}

ご覧のとおり、実行時にどこに到達できるかを確認するためにいくつかの出力を追加しましたが、最後に表示されるのは「5」です。

手伝って頂けますか?

ありがとうございました!

4

1 に答える 1

0

このように、ClassLoader は絶対パスからクラスをロードしようとします。これは、クラスが配置されているプロジェクト フォルダーにつながります。しかし、プロジェクトが単一の JAR ファイルにパックされると、このフォルダーはもう存在しません。したがって、解決策は、JAR ファイルを検索し、UrlClassLoader を使用してそれらをロードすることです。

File f = new File("file.jar");
    List<Class> classes = new ArrayList<Class>();

    URL [] urls = {new URL("jar:"+f.toURL()+"!/")};

    URLClassLoader classLoader = URLClassLoader.newInstance(urls);

    JarFile jarFile = new JarFile(f);
    Enumeration<JarEntry> e = jarFile.entries();
    String className=null;
    while(e.hasMoreElements()){
        JarEntry je = e.nextElement();

         if(je.isDirectory() || !je.getName().endsWith(".class")){
             continue;
         }

         className  = je.getName().substring(0,je.getName().length()-6);
         className = className.replace('/', '.');

         if(className.contains("test.smoke") || className.contains("test.ml") || className.contains("test.sanity")){
             System.out.println("classname::: "+className);
             Class c = Class.forName(className);
             classes.add(c);
         }
于 2013-02-05T10:02:42.947 に答える