2010-12-13 3 views
2

Я распространяю некоторый код для студентов, участвующих в первом семестре, которые создают ZIP-архив своей домашней работы в Eclipse. Для назначения N я создаю основной метод в классе hwN.Submitter, который вызывает библиотечный метод foo.Submit.zip(). Я распространяю основную и библиотеку в исполняемом JAR. foo довольно стабилен, но иногда он меняется. Библиотека вставляется в каждый файл JAR домашней работы.Замену классов из JAR Ранее в Classpath

Теперь предположим, что студент добавляет JAR hw1 к пути сборки Eclipse. Затем я изменяю API foo.Submit для hw2 и распространяю его JAR. Поскольку он добавлен позже в пути сборки, hw2.Submitter заканчивает загрузку foo.Submit из JAR hw1, который не содержит метод, поскольку API изменился.

Теперь у меня есть несколько вариантов: A) скажите моим ученикам удалить старые JAR, B) скажите моим ученикам изменить порядок пути сборки или C) напишите мой собственный загрузчик классов. Мне не нравится A, потому что для них полезно использовать JAR для старых домашних заданий. Мне не нравится B, потому что они программисты первого семестра. И я не могу заставить C работать.

Я играл с URLClassLoader, но загрузчик родительского класса сначала находит классы в старых JAR. Как я могу заменить эти старые JAR или переопределить загрузчик родительского класса?

+1

Действительно ли необходимо предоставить им код для отправки zip-файла? Они находятся в классе программирования. Они должны иметь возможность создать zip-файл, а затем разместить его на сервере где-нибудь (или загрузить его через веб-страницу курса). –

+0

Я думаю, вы пропустили первую часть семестра. Я могу, конечно, попросить их сделать это, но они будут опускать файлы, включать каталоги, rar или 7zip и т. Д. Заявитель также делает больше, чем сжимает. – kaerimasu

+0

Обычный способ разрешения таких конфликтов (это уродливое соглашение, но в любом случае ...) заключается в изменении пакета класса библиотеки. – CurtainDog

ответ

2

Хорошо, тыкаешься немного больше, я смог найти решение. Это загрузчик классов я придумал:

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; 
    } 
} 

Шляпы прочь к Alex Miller для рабочего примера.

Смежные вопросы