2017-01-24 5 views
0

スプリングブート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

答えて

0

ためにClassNotFoundExceptionで失敗し、あなたのランチャーコードは別々にする必要がありますSpring BootのMavenプラグインの依存関係として宣言されているモジュールです。この独立したモジュールは、Mavenの標準的なjarパッケージを使用する必要があります。SpringブートのMavenプラグインを使用して再パッケージ化しないでください。

設定する方法を示すsampleがあります。

+0

こんにちはAndy、私はそれを試みたことがあり、私はランチャーが詰まった。しかし、JARを実行しようとすると、**エラー:メインクラスを見つけたり読み込めなかったりします**。 JARの同じ場所に同じクラス(同一の内容、同じ名前)を手作業でコピーすると、動作します。どのような問題が起こっているのでしょうか? –

+0

いいえ、申し訳ありません。おそらく、問題を再現するコードをいくつか共有できますか? –

+0

元の質問にいくつかの詳細を追加しました。 –

関連する問題