我有一个问题:我写了一个实现STAF服务的Java程序(只是一个测试框架,http://staf.sourceforge.net/)。对于STAF,我所有的类都必须在STAF-INF / classes目录中。所以我把程序打包成JAR文件MyProg.jar,看起来像这样:
MyProg.jar
--> STAF-INF/
-------> classes/
------------> com/
----------------->/MyClass.class
----------------->/IInterface.class
---> META-INF/
所以,我的JAR-Archiv有两个目录,一个名为META-INF,名为STAF-INF。在STAF-INF中,有另一个名为classes的目录,在类中有我的包“com”,它包含我的类和我的接口。这就是情况。这个东西效果很好,而且我使用的STAF框架需要目录结构。
现在,问题出现了:
我希望其他用户可以将我的JAR文件(MyProg.jar)包含到自己的项目中,以编写实现我的界面IInterface的类。
问题1)当我将MyProg.jar文件添加到Eclipse-Java-Project时,它找不到IInterface。如果甚至在JAR文件中找不到任何包。我认为那些目录(STAF-INF / classes)有点关系?
问题2)当我在Eclipse中连接我的新项目和旧的MyProg-project时,Eclipse找到IInterface并且我可以实现它(这可能是解决问题1的一种方法,但是:)。然后我将我的新类导出为JAR文件,我们称之为NewClassForMyProg.jar。但是,当我在MyProg程序的NewClassForMyProg.jar中加载新类时,出现异常:
NoClassDefFoundError:com.IInterface
我认为这也与我的目录有关。但我不确定。我认为这可能是一个URLClassLoader或ClassPath的问题,但...我不知道...
请帮忙。感谢名单。
编辑:
这里是应该加载类的方法的代码:
public static ArrayList getExternalWorkloads(String jarName, String packageName)
{
jarName = "c:/STAF/services/NewClassForMyProg.jar";
packageName = "com";
packageName = packageName.replaceAll("\\." , "/");
ArrayList myClasses = new ArrayList();
JarInputStream jarFile = null;
JarEntry jarEntry = null;
try
{
jarFile = new JarInputStream(new FileInputStream (jarName));
while(true)
{
jarEntry=jarFile.getNextJarEntry();
if(jarEntry == null)
break;
if((jarEntry.getName ().startsWith (packageName)) &&
(jarEntry.getName ().endsWith (".class")))
{
String classname = jarEntry.getName().replaceAll("/", "\\.");
classname = classname.substring(0, classname.length() - 6);
if(classname.contains("$") == false)
{
ClassLoader.getSystemClassLoader();
URL url = new URL("jar:file:" + jarName + "!/");
URLClassLoader ucl = new URLClassLoader(new URL[] { url });
try
{
Class myLoadedClass = (Class) ucl.loadClass(classname);
IInterface myClass = (IInterface) myLoadedClass.newInstance();
myClasses.add(myClass);
}
catch(Exception e){}
}
}
}
jarFile.close();
}
catch(Exception e){}
return myClasses;
}哦,如果我用这个方法加载一个类,那是在我自己的JAR(MyProg.jar)中,它是完美的。但通过其他JAR(如NewClassForMyProg.jar),我得到一个错误,但该方法创建了类,问题是创建一个新实例并将其投影到IInterface ...