如何使用部署为uberjar的库?

时间:2012-10-17 13:45:18

标签: java jar uberjar google-reflections

我正在尝试使用Reflections 0.9.8库,它是一个超级jar。如果我在项目的构建路径中添加它的JAR(“reflections-0.9.8-uberjar”),那么Eclipse将找不到它的任何类类型:Reflection,ClasspathHelper等。

如果我提取单个“reflections-0.9.8.jar”( uber 一个)并将其添加到构建路径,那么在编译时一切正常很好,但是当我执行我的项目时,我得到一个NoClassDefFoundError(我很确定它是由缺乏依赖性引起的)。

我也尝试在uber-jar中添加每个.jar,但我仍然会得到NoClassDefFoundError。

如何使用此库作为uberjar分发?

修改 万一它可以提供帮助,这就是我想调用Reflections的方法(这是我从Can you find all classes in a package using reflection?获取的片段):

private static Set<Class<?>> getAllClassesInPackage(String pckg){
    List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
    classLoadersList.add(ClasspathHelper.contextClassLoader());
    classLoadersList.add(ClasspathHelper.staticClassLoader());

    Reflections reflections = new Reflections(new ConfigurationBuilder()
        .setScanners(new SubTypesScanner(false), new ResourcesScanner())
        .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
        .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(pckg))));

    return reflections.getSubTypesOf(Object.class);

}

1 个答案:

答案 0 :(得分:0)

我遇到了和你一样的问题,消息NoClassDefFoundError。搜索了一段时间我发现在其他罐子里面放着罐子,比如Reflections-0.9.8.jar中存在的罐子会产生这个问题。然而,当我像你一样提取它时,我再次看到同样的问题。我推断这可能是由于反射包的编译版本(在1.5版中编译)以及我的项目是在1.6上编译的。

我决定放弃使用Reflections包并发布一个临时解决方案来检索包中的类:

Can you find all classes in a package using reflection?

我希望它有所帮助。