2016-08-19 4 views
2

jetty-alpn-agent私のプロジェクトにALPNサポートを追加するには、.m2フォルダから実行する方法がわかります。これは、私の1つのuber-jarの代わりに2つのjar:sを配備する必要があります携帯性が低下します。'fat jar'の内部にJavaエージェントを指定しますか?

jarファイル内の場所を-javaagentスイッチに指定することはできますか?

java -javaagent:my.jar!/javaagents/jetty-alpn-agent-2.0.0.jar -jar myjar.jarのようなものをお探しですか?それはうまくいかないようです。

答えて

1

java.lang.instrumentationのドキュメントに記載されている場合があります。

実装で許可されている場合はjetty-alpn-agent.jarがシステムクラスパスの一部である必要があります。他のアプリケーションライブラリと同様に、my.jarに含める必要があります。

開始エージェントVMの起動

実装後VMが起動した後にいつかエージェントを開始するの機構を提供することができます。これがどのように開始されるかに関する詳細は実装固有のですが、通常、アプリケーションはすでに開始されており、そのメインメソッドは既に呼び出されています。 VMが起動した後に実装がエージェントの起動をサポートする場合は、次のようになります。

エージェントJARのマニフェストにはAgent-Class属性が含まれている必要があります。この属性の値は、エージェントクラスの名前です。

エージェントクラスは、パブリックstatic agentmainメソッドを実装する必要があります。

システムクラスローダー(ClassLoader.getSystemClassLoader)は、システムクラスパスにエージェントJARファイルを追加するメカニズムをサポートしている必要があります。

システムクラスパスにエージェントJARが追加されます。これは、通常、アプリケーションのメインメソッドを含むクラスをロードするクラスローダです。エージェントクラスがロードされ、JVMはagentmainメソッドを呼び出そうとします。また

public static void agentmain(String agentArgs); 

エージェントクラスをことがあります。その後、JVMを起動しようとするエージェントクラスは、このメソッドを実装していない場合は

public static void agentmain(String agentArgs, Instrumentation inst); 

:JVMは最初のエージェントクラスに次のメソッドを呼び出そうエージェントがコマンドラインオプションを使用して起動されている場合には、事前に使用する方法があります。 VMの起動後にエージェントが起動されると、premainメソッドは呼び出されません。

エージェントには、agentArgsパラメータを介してエージェントオプションが渡されます。エージェントオプションは単一の文字列として渡され、追加の解析はエージェント自体によって実行される必要があります。

agentmainメソッドは、エージェントを起動するために必要な初期化を行う必要があります。起動が完了したら、メソッドはリターンするはずです。エージェントを起動できない場合(エージェントクラスをロードできない、エージェントクラスに適合するagentmainメソッドがないなど)、JVMは中断しません。 agentmainメソッドがキャッチされない例外をスローすると、無視されます。

PS:これは決して試したことがありません。それが動作するかどうか私に教えてください。

+0

これは、よりシンプルなエージェント用のjarファイルのオプションになる可能性がありますが、この特定のjarファイルはその内部にjarファイルがあります。また、 'agentmain()'メソッドを実装するラッパークラスを作成する必要がありました。クラスパスがロードしようとすると問題が発生します。 私は弾丸を噛んで 'agents'ディレクトリに追加し、起動スクリプトに追加すると思います。長期的に移行しているプラ​​ットフォームは、デプロイ時にこのエージェントのjarを自動的に検出するため、これを一時的な解決策として使用できます。 –

+0

ランタイムアタッチメントは、クラスがまだアタッチ時にロードされないことを保証しません。しかし、ロードされたクラスは、異なる形状を許容せずに、異なるメソッド実装を提供するようにのみ変更することができます。 –

0

fatain jarのマニフェストにpremainクラスを書き込むことで、以前のエージェントをエミュレートできます。次に、ファストジャーをjavaagentjar引数の両方に追加してください。

インスツルメンテーションAPIは非常に強力であり、セキュリティマネージャが攻撃のエントリポイントを提供するのを避けることができるため、これを避けることはできません。ただし、JDKまたはJava 9 VMで自己アタッチすることはできます。 バイトバディエージェントライブラリは、このための既成の依存関係を提供します。このようにして、計装インスタンスを保持した後、手動でpremainメソッドを呼び出すことができます。

関連する問題