どのように負荷jarファイル実行時に[複製]
-
10-07-2019 - |
質問
この質問に答えはこちら
- いつ、どのように負荷瓶動的に実行時? 15回答
私の構築javaシステムの負荷の新しいコード(拡張)が走っています。う再負荷のjarファイルがコードが実行?はい負荷の新しいjar?
明らかに、常にアップ時間が重要なので、そういった追加する機能を再負荷の既存のクラスにいながらでない場合は難しいことは言).
今後もいらないようお願いしですか?(も二つの異なる問題につ再読み込みに関する授業実行時には、その他に関する新しいクラス).
解決
既存のクラスを既存のデータでリロードすると、問題が発生する可能性があります。
新しいコードを新しいクラスローダーに比較的簡単にロードできます。
ClassLoader loader = URLClassLoader.newInstance(
new URL[] { yourURL },
getClass().getClassLoader()
);
Class<?> clazz = Class.forName("mypackage.MyClass", true, loader);
Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class);
// Avoid Class.newInstance, for it is evil.
Constructor<? extends Runnable> ctor = runClass.getConstructor();
Runnable doRun = ctor.newInstance();
doRun.run();
使用しなくなったクラスローダーはガベージコレクションできます(ThreadLocal、JDBCドライバー、 java.beans
などを使用する場合によくあるように、メモリリークがない限り)。
オブジェクトデータを保持する場合は、シリアル化などの永続化メカニズム、または慣れているものをお勧めします。
もちろん、デバッグシステムはより複雑な処理を実行できますが、よりハッキング性が高く、信頼性が低くなります。
新しいクラスをクラスローダーに追加することができます。たとえば、 URLClassLoader.addURL
を使用します。ただし、クラスがロードに失敗した場合(たとえば、追加していないため)、そのクラスローダーインスタンスにはロードされません。
他のヒント
これは私のために働く:
File file = new File("c:\\myjar.jar");
URL url = file.toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("com.mypackage.myclass");
私の構築javaシステムの負荷のコードで走りながら
するためにベースシステム OSGi 少なくともせっかくです)とは正にこの状態です。
釣たclassloaderが本当に難しい事業などのクラスの視認性の作品は、いラハ-デバッグの問題。例えば、 クラスです。forName(), などに広く用いられている多くの図書館にないものに分断されたclassloader。
少しグーグルで調べたところ、このコードはこちら:
File file = getJarFileToLoadFrom();
String lcStr = getNameOfClassToLoad();
URL jarfile = new URL("jar", "","file:" + file.getAbsolutePath()+"!/");
URLClassLoader cl = URLClassLoader.newInstance(new URL[] {jarfile });
Class loadedClass = cl.loadClass(lcStr);
このアプローチに関する意見/コメント/回答を誰でも共有できますか?
ここに示すように、org.openide.util.LookupとClassLoaderを使用して、Jarプラグインを動的にロードします。
public LoadEngine() {
Lookup ocrengineLookup;
Collection<OCREngine> ocrengines;
Template ocrengineTemplate;
Result ocrengineResults;
try {
//ocrengineLookup = Lookup.getDefault(); this only load OCREngine in classpath of application
ocrengineLookup = Lookups.metaInfServices(getClassLoaderForExtraModule());//this load the OCREngine in the extra module as well
ocrengineTemplate = new Template(OCREngine.class);
ocrengineResults = ocrengineLookup.lookup(ocrengineTemplate);
ocrengines = ocrengineResults.allInstances();//all OCREngines must implement the defined interface in OCREngine. Reference to guideline of implement org.openide.util.Lookup for more information
} catch (Exception ex) {
}
}
public ClassLoader getClassLoaderForExtraModule() throws IOException {
List<URL> urls = new ArrayList<URL>(5);
//foreach( filepath: external file *.JAR) with each external file *.JAR, do as follows
File jar = new File(filepath);
JarFile jf = new JarFile(jar);
urls.add(jar.toURI().toURL());
Manifest mf = jf.getManifest(); // If the jar has a class-path in it's manifest add it's entries
if (mf
!= null) {
String cp =
mf.getMainAttributes().getValue("class-path");
if (cp
!= null) {
for (String cpe : cp.split("\\s+")) {
File lib =
new File(jar.getParentFile(), cpe);
urls.add(lib.toURI().toURL());
}
}
}
ClassLoader cl = ClassLoader.getSystemClassLoader();
if (urls.size() > 0) {
cl = new URLClassLoader(urls.toArray(new URL[urls.size()]), ClassLoader.getSystemClassLoader());
}
return cl;
}