Java 在类路径的前面从JAR替换类
我向第一学期编程的学生分发了一些代码,这些代码在Eclipse中创建了他们作业的ZIP存档。对于赋值N,我在类hwN.Submitter中创建了一个main方法,该方法调用库方法foo.Submit.zip()。我在一个可执行JAR中分发main和库。foo相当稳定,但偶尔会发生变化。该库捆绑在每个家庭作业的JAR文件中 现在,假设一名学生将hw1的JAR添加到Eclipse的构建路径中。然后我更改了foo.Submit的API以获得hw2并分发其JAR。由于它稍后添加到构建路径中,hw2.Submitter最终从hw1的JAR加载foo.Submit,该JAR不包含API更改后的方法 现在,我似乎有几个选择:a)告诉我的学生移除旧jar,B)告诉我的学生重新排序构建路径,或者C)编写我自己的类加载器。我不喜欢家庭作业,因为对他们来说,在旧的家庭作业上使用罐子是很有用的。我不喜欢B,因为他们是第一学期的程序员。我不能让C工作Java 在类路径的前面从JAR替换类,java,eclipse,Java,Eclipse,我向第一学期编程的学生分发了一些代码,这些代码在Eclipse中创建了他们作业的ZIP存档。对于赋值N,我在类hwN.Submitter中创建了一个main方法,该方法调用库方法foo.Submit.zip()。我在一个可执行JAR中分发main和库。foo相当稳定,但偶尔会发生变化。该库捆绑在每个家庭作业的JAR文件中 现在,假设一名学生将hw1的JAR添加到Eclipse的构建路径中。然后我更改了foo.Submit的API以获得hw2并分发其JAR。由于它稍后添加到构建路径中,hw2.Su
我使用过URLClassLoader,但是父类装入器首先在旧JAR中找到类。如何替换这些旧JAR或重写父类加载器?好的,再仔细研究一下,我找到了一个解决方案。这是我提出的类加载器:
package speccheck;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
/**
* Create a class loader which favors speccheck.* classes from the JAR
* associated with the homework.
*/
public class LatestSpecCheckClassLoader extends URLClassLoader {
/**
* Create a loader which checks $(pwd)/bin/speccheck_TAG_DO_NOT_SUBMIT.jar
* first for speccheck.* classes
*
* @param tag
* Homework tag, like "hw4" or "pre2".
* @throws MalformedURLException
*/
public LatestSpecCheckClassLoader(String tag) throws MalformedURLException {
super(new URL[]{new URL("file://" + System.getProperty("user.dir") + "/bin/" + tag + "/speccheck_" + tag + "_DO_NOT_SUBMIT.jar")});
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
// Check for cached.
Class<?> loadedClass = findLoadedClass(name);
if (loadedClass != null) {
return loadedClass;
}
// If the class is in the speccheck package, do not delegate to parent
// loader. Check in the URLs registered with this loader instead.
try {
if (name.startsWith("speccheck.")) {
loadedClass = findClass(name);
}
} catch (ClassNotFoundException e) {
}
// If still not found, then let's defer.
if (loadedClass == null) {
return super.loadClass(name);
}
return loadedClass;
}
}
包装规格检查;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.net.URLClassLoader;
/**
*创建一个支持JAR中speccheck.*类的类加载器
*与家庭作业有关。
*/
公共类LatestSpecCheckClassLoader扩展URLClassLoader{
/**
*创建一个检查$(pwd)/bin/speccheck\u TAG\u DO\u NOT\u SUBMIT.jar的加载程序
*speccheck.*类的第一个
*
*@param标签
*作业标签,如“hw4”或“pre2”。
*@抛出错误的DurException
*/
public LatestSpecCheckClassLoader(字符串标记)引发畸形的异常{
super(新URL[]{newURL(“file://“+System.getProperty(“user.dir”)+”/bin/“+tag+”/speccheck+tag+”\u DO\u NOT\u SUBMIT.jar”)});
}
@凌驾
公共类loadClass(字符串名称)引发ClassNotFoundException{
//检查是否存在缓存。
Class loadedClass=findLoadedClass(名称);
如果(loadedClass!=null){
返回加载类;
}
//如果类在speccheck包中,则不要委托给父类
//加载器。请检入使用此加载器注册的URL。
试一试{
if(name.startsWith(“speccheck”)){
loadedClass=findClass(名称);
}
}catch(classnotfounde异常){
}
//如果仍然找不到,那么让我们推迟。
如果(loadedClass==null){
返回super.loadClass(名称);
}
返回加载类;
}
}
向各位致敬,以获取一个有效的示例。是否真的需要向他们提供提交zip文件的代码?他们在编程课上。他们应该能够创建一个zip文件,然后把它放在某个服务器上(或者通过课程网页上传)。我想你错过了第一学期的部分。我当然可以要求他们这样做,但他们会忽略文件,包括目录、rar或7zip等等。提交者也做的不仅仅是压缩。解决此类冲突的传统方法(这是一个丑陋的约定,但无论如何…)是更改库类的包。我想你比我更了解你的类。。。很高兴看到你解决了类加载器的问题。类的数量(+200)需要管理提交。我在过去一直把它放在一边,清理他们的错误是一项繁重的工作。