Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在类路径的前面从JAR替换类_Java_Eclipse - Fatal编程技术网

Java 在类路径的前面从JAR替换类

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

我向第一学期编程的学生分发了一些代码,这些代码在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工作


我使用过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)需要管理提交。我在过去一直把它放在一边,清理他们的错误是一项繁重的工作。