2010-12-13 9 views
2

Eclipse内で宿題のZIPアーカイブを作成する私の最初の学期のプログラミングの学生にいくつかのコードを配布します。代入Nについては、クラスfw.Submit.zip()を呼び出すhwN.Submitterクラスのmainメソッドを作成します。私はメインとライブラリを実行可能なJARに配布します。 fooはかなり安定していますが、ときどき変化します。図書館は各宿題のJARファイルにバンドルされています。クラスパスの先にあるJARからのスーパークラスのクラス

生徒がhw1のJARをEclipseのビルドパスに追加したとします。私はhw2のためのfoo.SubmitのAPIを変更し、そのJARを配布します。後でBuild Pathに追加されるので、hw2.Submitterはhw1のJARからfoo.Submitのロードを終了します。これは、APIが変更されてからメソッドを含んでいません。

私はいくつかの選択肢があるようです:A)古いJARを削除するように学生に教えてください。B)学生にビルドパスを並べ替えるか、C)自分のクラスローダを書くよう教えてください。私は古い宿題でJARを動かすのが便利なので、Aが気に入らない。私は最初の学期のプログラマーなので、Bが気に入らない。そして私はCを働かせることができません。

私はURLClassLoaderで遊んだことがありますが、親クラスローダーは古いJARのクラスを最初に見つけます。これらの古いJARに代わる方法、または親クラスローダをオーバーライドする方法はありますか?

+1

zipファイルを送信するコードを提供することは本当に必要ですか?彼らはプログラミングクラスに入っています。彼らは、zipファイルを作成し、それをサーバーのどこかに置くことができるはずです(またはコースWebページを通してアップロードする)。 –

+0

私はあなたが最初の学期の部分を逃したと思います。私は確かにこれをするように頼むことができますが、ファイルを省略したり、ディレクトリを含めたり、rarまたは7zipなどします。 – kaerimasu

+0

このような競合を解決する従来の方法(醜い規則ですが、とにかく...)は、ライブラリクラスのパッケージを変更することです。 – CurtainDog

答えて

2

もう少し詳しく調べてみると、解決策を見つけることができました。ワーキング例えばAlex Millerを切っ

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

帽子:これは私が思いついたクラスローダです。

関連する問題