なぜ私の面での取得を行元の設定は満員の際は別のjarというかな?

StackOverflow https://stackoverflow.com/questions/1265487

  •  13-09-2019
  •  | 
  •  

質問

思aspectj...

書いた以下の側面を対象として追加のログイン機能通話の種類 public * doSomething*(..).う場合のメインクラスの一部である同プロジェクトを織りの側面がマテリアルであるされており、ボのコードを実行す.またデジタル-メディアに関する最新の織コードを瓶と呼んでいから別のeclipseプロジェクトのアドバイス実行されません。他のシナリオのパッキングの側面(.粉遊び王にツイッターのみを個別のjarを追加するjarの"側面パス"eclipseを可能にするこeclipseが織りな側面です。ことはで包むことjarをコードからです。ない仕事は驚くべきことではないのではないかと思い...)なぜですか?

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.CodeSignature;
import org.apache.log4j.Logger;

public aspect Logging {
    pointcut allPublic(): !cflow(call(public void main(..))) && (call(public * doSomething*(..)));

    private static final Logger log = Logger.getLogger("Logging.aspect");

    @SuppressWarnings({"unchecked", "unused"})
    private void printParameters(JoinPoint jp) {
        CodeSignature methodSignature = (CodeSignature) jp.getSignature();
        String methodName = methodSignature.getName();
        Object[] paramNames = methodSignature.getParameterNames();
        Class[] paramTypes = (Class[])methodSignature.getParameterTypes();
        Object[] paramObjects = jp.getArgs();
        StringBuffer infoMsg = new StringBuffer();

        infoMsg.append("Entering function: " + methodName);
        if (paramNames != null && paramNames.length > 0){
            if (paramNames.length == 1){
                infoMsg.append(" with input parameter: ["+ paramNames[1]+ "] = [" + paramObjects[1] + "]");
            }
            else {
                infoMsg.append(" with input parameters: ");
            }
            for (int i = 1; i < paramNames.length; i++) {
                infoMsg.append(" [" + paramTypes[i].getName() + " " + paramNames[i]+ "] = [" + paramObjects[i] + "]");
            }
        }
        else {
            infoMsg.append(" NONE");
        }
       log.info(infoMsg.toString());

    }

    @SuppressWarnings("unused")
    private void printExit(JoinPoint jp) {
        log.info("Exit function: " + jp.getSignature().toString());
    }

    before() : allPublic() {
        printParameters (thisJoinPoint);
    }

    after() : allPublic() {
        printExit(thisJoinPoint);
    }
}

のクラスです:

public class Main {

    private static final Logger log = Logger.getLogger("A.class");

    public static void doSomethingAa(int number, String message, Map<String, String> map){
        log.debug("A");
    } 

    public static void doSomethingB(int id, String name){
        log.debug("B");
    }

    public static void main(String[] args){
        Map<String, String> map1 = new TreeMap<String, String>();
        Map<String, String> map2 = new TreeMap<String, String>();

        map1.put("FirstKey", "FirstValue");
        map1.put("SecondKey", "SecondValue");

        map2.put("Tal", "Guy");
        map2.put("Happy", "Birthday");

        A.doSomethingAa(17, "Tal", map1);
        A.doSomethingAa(35, "Guy", map2); 

        A.doSomethingB(12, "TalG");
        A.doSomethingB(40, "GuyG");

        System.out.println("Finished running main");

    }

}

感謝!

役に立ちましたか?

解決

だってaspectjにプラグイン開発、がある場合がございますの数追加。ここでは、いくつかの必要な確保のための対象が織り正確にコンパイル時ンを実行することができます。

  • プラグインが織りなニーズへの依存のプラグインを含む側面
  • 当該側面が必要に輸出パッケージにはclasspath
  • 対象のプラグインが必要aspectjrtのクラスパスでの面
  • のaspectjコンパイラを使用する必要が織りなの目標ときに取りまとめを行いました。

更新していきまで再現の問題(での動作にはマイボックス).複製する状況を作成した、AspectJプロジェクトのシングルです。ajファイルのソースディレクトリです。I輸出されることとしてjarファイルと呼ばれるlogging.jarについて他のプロジェクトのルート(その他のプロジェクトにおいてはAspectJプロジェクトを含む"本"を行っています。-その後、更には側面のパスは"主"プロジェクトのlogging.jar の面でのアドバイスが織り各doSomethingAa()およびdoSomethingB()メソッドます。

唯一の問題発見とコードがstaticメソッドの呼び出しのために"、"よりも"メイン".

こちらからのエントリーの主要プロジェクトです。classpathファイル:

<classpathentry kind="lib" path="logging.jar">
  <attributes>
    <attribute name="org.eclipse.ajdt.aspectpath"
        value="org.eclipse.ajdt.aspectpath"/>
  </attributes>
</classpathentry>

たって様々な組み、唯一の方法で取得できます ない 仕事を取り除き、AspectJの自然または削除、jarから構築ます。

その他の要因が影響を与えることで、ワークスペースを省略?


他の点につロギングの側面から同様のプロジェクト別の前後のアドバイスに結JoinPointインスタンス作成中に二回毎のメソッドの呼び出し、問題の発生の原因になるのはガベージコレクションの場合はログインタイプが織りなす多くの方法。り替わりますことを検討してはどうかと思うを使用周辺のアドバイスをログに出入りもしやすくなりに追加任意のメソッドが実行時にログインする場合には、その結果生じる。


更新:に基づくコメントしているものであり、発表という第三のプロジェクト(aj_client)マイワークスペースを見いだし、以下の手順:

  1. 変更ロギングajいます。出し、否log4jの構成問題
    • 輸出aj_logging(AspectJプロジェクトを含む。粉遊び王にツイッター)logging.jar
    • 追加logging.jar の面でのパスaj_target
    • 輸出aj_target(AspectJプロジェクトを含むMain.java)target.jar
    • 新しいクラスClient.javaのaj_clientプロジェクトはAspectJできます。
    • 追加target.jar,logging.jar (log4j.jarのJavaのビルド-パスのaj_clientして走ってます。

Client.java 一方法:

public static void main(String[] args) {
    Main.main(args);
}

が、この失敗とNoClassDefFoundError:

Exception in thread "main" java.lang.NoClassDefFoundError: org/aspectj/lang/Signature
at Client.main(Client.java:6)
Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.Signature

そこで、私を変更した.classpathのaj_clientでaspectjrtることもできないように手動で追加の AspectJライブラリ classpathのコンテナーになります。クラスパス)reranのプログラムを実行し、出力のログイン諸表の作成に

Entering function: doSomethingAa with input parameters:  [java.lang.String message] = [Tal] [java.util.Map map] = [{FirstKey=FirstValue, SecondKey=SecondValue}]
log4j:WARN No appenders could be found for logger (A.class).
log4j:WARN Please initialize the log4j system properly.
Exit function: void target.Main.doSomethingAa(int, String, Map)
Entering function: doSomethingAa with input parameters:  [java.lang.String message] = [Guy] [java.util.Map map] = [{Happy=Birthday, Tal=Guy}]
Exit function: void target.Main.doSomethingAa(int, String, Map)
Entering function: doSomethingB with input parameters:  [java.lang.String name] = [TalG]
Exit function: void target.Main.doSomethingB(int, String)
Entering function: doSomethingB with input parameters:  [java.lang.String name] = [GuyG]
Exit function: void target.Main.doSomethingB(int, String)
Finished running main

きます。classpathファイルaj_clientようになります:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src/main/java"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="con" path="org.eclipse.ajdt.core.ASPECTJRT_CONTAINER"/>
    <!-- the other jars for the logging and target projects -->
    <classpathentry kind="lib" path="/aj_target/target.jar"/>
    <classpathentry kind="lib" path="/aj_target/log4j-1.2.14.jar"/>
    <classpathentry kind="lib" path="/aj_target/logging.jar"/>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

もし指っaspectjrt私のMavenリポジトリとEclipseプラグインと同じ結果のログメッセージが出力)、置き換え:

<classpathentry kind="con" path="org.eclipse.ajdt.core.ASPECTJRT_CONTAINER"/>

<!--aspectjrt from Maven repository-->
<classpathentry kind="lib" path="C:/maven-2.2.0/repo/aspectj/aspectjrt/1.5.3/aspectjrt-1.5.3.jar"/>

または

<!--aspectjrt from Eclipse plugin -->
<classpathentry kind="lib" path="C:/eclipse-3.5/eclipse/plugins/org.aspectj.runtime_1.6.5.20090618034232/aspectjrt.jar"/>

このロギングコードが織りなす、長年にわたって変更ロギング粉遊び王にツイッター利用getLog().情報()の呼び出し、再度の伐採算な出力に出力します。これになっていたため、log4j.xml 設定ファイルだけを指定する根アペンダ)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> 
    </layout> 
  </appender> 

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="console" /> 
  </root>

</log4j:configuration>

この結果、以下の出力:

DEBUG class - A
INFO  Logging - Exit function: void target.Main.doSomethingAa(int, String, Map)
INFO  Logging - Entering function: doSomethingB with input parameters:  [java.lang.String name] = [TalG]
DEBUG class - B
INFO  Logging - Exit function: void target.Main.doSomethingB(int, String)
INFO  Logging - Entering function: doSomethingB with input parameters:  [java.lang.String name] = [GuyG]
DEBUG class - B
INFO  Logging - Exit function: void target.Main.doSomethingB(int, String)
Finished running main

注するので要注意を持っていることを確認するための洗浄構築および輸出logging.jar 前洗浄、建物、および輸出target.jar詳細は、お客様のプロジェクト.まmuckの順ですべてごく一致しない。


概要

かつて貴社のクライアントプロジェクト参照を"target.jar"建設されたとのAspectJのです。ajした織り), していaspectjrt.jar るclasspath 設定したlog4jを正しくログが出力されます。

で指定できますaspectjrt依存性のいずれかの追加のクラスパスのコンテナによるパスを指定し対応aspectjrt.jar

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top