17

アイデアが不足しているので、次のことが誰かとベルを鳴らすことを本当に望んでいます. さらに診断する方法についての回答または提案をいただければ幸いです。

18 か月間問題なく実行されている Java アプリがあります。現在、Windows Server 2019 Standard を VM として実行する新しいプラットフォームに移行しています。最初のインストールではすべてが正しく実行されますが、定期的にアプリケーションが起動に失敗し、すべての jar ファイルを再コピーすることによってのみ修正できます。これは一時的なもので、最終的には再び失敗します。

多くの監視の結果、すべてのファイルに定期的に「L」ファイル属性を設定し、再解析データも作成する Windows プロセスがあることに気付きました。これは問題ではありませんが、これが発生すると、JVM はアプリケーションを起動できなくなります。(どの Windows 専門家も、これが何をするかについて考えを持っていますか?)

重要な点は、次のような JPMS パラメータを指定してアプリを起動することです。

java -p MyApp.jar;MyApp_mods -m  mymodule/mypackage.StartGUI

これは、「L」属性がjarファイルに設定されているユニットでうまく実行され、次のメッセージで失敗します。

Error occurred during initialization of boot layer
java.lang.module.FindException: Module format not recognized: MyApp.jar

MyApp.jar の名前を別の名前に変更し、それを MyApp.jar にコピーして戻すと、L 属性と再解析データのないファイルが作成されるため、問題が修正されます (プロセスが再適用するまで)。

この動作は、この 1 つの操作だけに適用されるのではなく、次のようなモジュール システムが使用されるすべての場所に適用されます。

 java --list-modules any-jar-in-the-app.jar    

興味深いことに (!)、より単純な非モジュール式アプリを試して次のように実行すると:

java -jar MySimpleApp.jar

L 属性が設定されていても、アプリは正しく実行されます。

明らかに完全には理解できていませんが、モジュールシステムを介して実行すると、L属性/リパースデータを持つファイルが読み取れないことを意味しているように見えます(?)

OpenJDK ホットスポットと OpenJ9 JVM の両方をさまざまなバージョンで試しましたが、結果は同じでした。何か案は?

4

2 に答える 2

7

これはバグだと思います。

Reparse Point 属性は、NTFS ファイルシステムで使用され、シンボリック リンクの実装、マウント ポイントの実装、使用頻度の低いファイルの長期保存領域 (圧縮ファイル/ファイル システム) またはデバイス (テープなど) への自動移動などの他のファイル システム手法の実装に使用されます。

「再解析ポイントと拡張属性は相互に排他的です。ファイルに拡張属性が含まれている場合、NTFS ファイル システムは再解析ポイントを作成できず、再解析ポイントを含むファイルに拡張属性を作成できません。」

したがって、回避策は、ファイルに拡張属性を設定して、この動作/バグを禁止することです。

PSあなたのWindows Serverはある種の「使用頻度の低いファイルの自動圧縮/移動」サービスを実行していると思います。可能な場合は、このサービスを無効にしてください。

于 2021-04-14T16:59:19.720 に答える