スプリングブートMavenプラグイン。 LayoutFactoryの新機能です。 1.5.0.M1以降で利用可能です。カスタムランチャClassNotFoundカスタムレイアウトを使用している場合の例外
私はカスタムレイアウトでカスタムランチャーを定義するとき、私は問題を抱えています:
@Override public String getLauncherClassName() { return "com.mycompany.CustomLauncher"; }
私はブートアプリケーションのソースで私のカスタムランチャーが含まれている場合、それはBOOT-INF /クラスに再パッケージ化、およびときますJARを実行しようとすると、ClassNotFound例外が発生して失敗します。
私はRepackagerコードを読んでいますが、再パッケージ化シーケンスから特定のクラスを選択的に除外できるフックは見つかりません。私のレイアウトでgetRepackagedClassesLocationメソッドをオーバーライドすると、ブートメインクラスが別のクラスローダーによってロードされ、SpringBoot ClassNotFoundで失敗します。
私はBOOT-INF/classesの再パッケージ化からランチャーを強制できますか?コードがアクセス可能であることを確認するために
UPDATE 1
@Override
public void writeLoadedClasses(LoaderClassesWriter writer) throws IOException
{
String name = PropertiesLauncherInternal.class.getName().replaceAll("\\.", "\\\\") + ".class";
InputStream inputStream = PropertiesLauncherInternal.class.getResourceAsStream(PropertiesLauncherInternal.class.getSimpleName() + ".class");
writer.writeEntry(name, inputStream);
writer.writeLoaderClasses();
}
私はこのテストを追加しました:
BOOT-INF/--1
BOOT-INF/classes/--1
BOOT-INF/classes/com/-0
BOOT-INF/classes/com/test/-0
BOOT-INF/classes/com/test/Boot.class-2405822989
...
com\launcher\PropertiesLauncherInternal.class--1
:最初のループのために
JarInputStream is = new JarInputStream(new FileInputStream(new File("c:/git/dev/framework/boot/target/boot-current-SNAPSHOT.jar")), true);
JarEntry entry = null;
while (null != (entry = is.getNextJarEntry()))
{
System.out.println(entry.getName() + "-" + entry.getCrc());
}
URL url = new File("c:/git/dev/framework/boot/target/boot-current-SNAPSHOT.jar").toURL();
URL[] urls = new URL[] { url };
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("com.test.Boot");
Class cls = cl.loadClass("com.launcher.PropertiesLauncherInternal");
を私は次のログを取得します
クラス名の横にある数字はCRCです。私は関連性があるかどうかはわかりませんが、CRC-32は不明です。
クラスローダを使用している場合、私はcom.test.Bootをロードすることができていますが、それはむしろ、アプリケーションのコードと一緒にそれを持つよりも、PropertiesLauncherInternal.class
こんにちはAndy、私はそれを試みたことがあり、私はランチャーが詰まった。しかし、JARを実行しようとすると、**エラー:メインクラスを見つけたり読み込めなかったりします**。 JARの同じ場所に同じクラス(同一の内容、同じ名前)を手作業でコピーすると、動作します。どのような問題が起こっているのでしょうか? –
いいえ、申し訳ありません。おそらく、問題を再現するコードをいくつか共有できますか? –
元の質問にいくつかの詳細を追加しました。 –