2016-09-14 4 views
1

私はすべてのデプロイされたアプリケーションのリストを取得しようとしています。具体的にはtomcatルートにマッピングされたアプリケーションの名前です。 Tomcatサーバーに関する情報を収集するJavaエージェントを使用して、実行時に実行したいと考えています。 が、私はこのコードサンプルを使用してみました:Tomcat 7 - java-agent/aspectj経由でログインせずに実行時にアプリケーション名を取得

private Iterable<String> collectAllDeployedApps() { 
    try { 
     final Set<String> result = new HashSet<>(); 
     final Set<ObjectName> instances = findServer() 
       .queryNames(new ObjectName("Tomcat:j2eeType=WebModule,*"), null); 
     for (ObjectName each : instances) { 
      result.add(substringAfterLast(each.getKeyProperty("name"), "/")); //it will be in format like //localhost/appname 
     } 
     return result; 
    } catch (MalformedObjectNameException e) { 
     //handle 
    } 
} 

a similar questionから運ばれたが、以来、私はマネージャーアプリにログインしていないよ、私は右の権限を持っていないので、私は空のリストを取得します。

実際に私が望むのは、(aspectJに基づいた)Javaエージェントがあり、実行時/展開時などに、マネージャに実際にログインせずにすべての配備済みアプリケーションのリストを取得できるようにしたいと思います。私自身。 どうすればいいですか? Tomcatのデプロイメントコード(既にコードを実装しているので、私の側からログインする必要はありません)をインストールするのは気にしませんが、どの機能をインストルメントするのかは分かりません。質問は2部で構成されてい

おかげで、 林

+0

なぜあなたはコンテナのセキュリティを迂回しようとしていますか?単にマネージャーにプログラムでログインしないのはなぜですか?それにはAPIが必要です。あなたは真剣にここにアプリケーションサーバーをハッキングするための助けを得ようとしていますか?私があなたを助けることを検討する前に、自分で説明してください。 – kriegaex

+0

@kriegaex - 監視ツールのような、アプリケーション上の「アドオン」です。私は何かをハックしようとしていません。エージェントは、システムで何が行われたかにアクセスして見ることができますが、ログイン情報はありません。それはtomcatのスタートアップコードにもアクセスすることができます。そのコードを実装するだけで十分です。私はちょうどエージェントがログインする必要があるので、私はちょうどAPIを使用することができません。そして、tomcatのどのコードがアプリケーションを配備しているのか分かりません。 – Lin

+0

@kriegaex - アプリケーションはエージェント(バイトコード計測)で開始されます – Lin

答えて

0

  • は、すべてのデプロイされたアプリケーションのリストを取得する - TomcatのAPIを確認した後、私は、インストルメントすることができ、いくつかの関連する展開コード部分を見つけました: WarWatcher.java(変更を検出できるようにする)、起動時に呼び出されるUserConfig.javaのアプリケーション(setDirectory名などで計測が可能)、もちろんstratupで呼び出されるHostConfig.javaのアプリケーションを見ることができます。

    また
    protected void org.apache.catalina.startup.HostConfig.deployWARs(java.io.File, java.lang.String[]) 
    
    protected void org.apache.catalina.startup.HostConfig.deployApps() 
    
    protected void org.apache.catalina.startup.HostConfig.deployWAR(org.apache.catalina.util.ContextName, java.io.File) 
    

    - あなたは引数を確認することができます。

    protected boolean org.apache.catalina.startup.HostConfig.deploymentExists(java.lang.String) 
    

    これは、(通常はアプリケーション名+を意味している - )戦争/フォルダ名が含まれています。

  • これはServletContext.getRealPath()を使って行うことができます - フォルダ名を返します。そこから戦争名を抽出できます(私の場合は少なくともアプリケーション名として使用できます)。

+0

'getRealPath()'は、特にルートアプリケーションのアプリケーション名を返しません。 – EJP

+0

@EJP - war名(通常はアプリ名として使用できる)を抽出するために使用できるので、私が探していたフォルダ名が返されます。 – Lin

関連する問題