2017-04-01 31 views
0

基本上我有一個普通的Java應用程序,與主。我使用Intelij Ultimate。我有以下朋友不能讓我的方面運行

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>88</groupId> 
    <artifactId>SpaceX</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <dependencies> 
     <!-- https://mvnrepository.com/artifact/postgresql/postgresql --> 
     <dependency> 
      <groupId>postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.1-901.jdbc4</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/log4j/log4j --> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.17</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/aspectj/aspectjrt --> 
     <dependency> 
      <groupId>aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>1.5.4</version> 
     </dependency> 



    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5.1</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

所以我也有一個LoggingAspect,我只是不知道如何運行。我也試過這個http://confluence.jetbrains.com/display/~roman.shevchenko/AspectJ+Support+Plugin

手動下載了jar,但我也下載了方面的Intelij插件。像AspectJ支持和Spring方面一樣。

我的切面類看起來是這樣的:

public aspect LoggingAspect { 
    pointcut tracing():call(public * com.company..*.*(..)) && !within(LoggingAspect); 

    private Logger logger= Logger.getLogger("com.company"); 

    public LoggingAspect() { 
     PropertyConfigurator.configure("logging.properties"); 
    } 

    before(): tracing(){ 
     logger.info("Entering: "+ thisJoinPointStaticPart.getSignature()); 
    } 

    after():tracing(){ 
     logger.info("Exiting: "+ thisJoinPointStaticPart.getSignature()); 
    } 
} 

正如你所看到的。我想使用java.util.logging.Logger,我有一個logging.properties文件,我在其中設置輸出文件。我嘗試編譯應用程序,就像上面粘貼的鏈接,正常運行應用程序,似乎沒有任何工作。我的方面根本沒有工作/沒有被使用。有什麼建議?我錯過了什麼嗎?

我不想用註釋尚未使用Spring Aspect。我不知道如何使這一個第一個工作

我改變了我的編譯器爲ajc和測試連接,一切都很好。我已經將Aspectjrt添加到依賴關係中......當我嘗試運行該程序時,它仍然不會執行任何操作。它只是正常運行而不應用這些方面。 任何想法?

+0

你想編譯期使用或加載時織入?我的答案取決於你的。另一個需要驗證的問題是:AspectJ對你來說是一個新話題,我認爲? – kriegaex

+0

是的,這是一個新的話題,我找不到任何好的材料來閱讀。我想運行我的程序,並在運行應用程序時獲取文件中的日誌。我假設我想要加載時織入正確的? – Mocktheduck

+0

那裏有很多很好的材料。爲什麼不從[AspectJ文檔]開始(https://eclipse.org/aspectj/docs。PHP),如果你打算使用Maven通過編譯時織建立你的產品,[AspectJ的Maven插件文件(http://www.mojohaus.org/aspectj-maven-plugin/)。由於您似乎不確定,我推薦CTW,而不是LTW。如果您同意,我可以提供一個示例Maven POM以便讓您的示例代碼正常運行。 – kriegaex

回答

1

這是編譯時編織的解決方案。因爲所有主要的IDE都可以從Maven導入和更新項目,所以它可以在Eclipse,IntelliJ IDEA以及NetBeans(從未嘗試過)中工作。

Maven的POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>88</groupId> 
    <artifactId>SpaceX</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.source-target.version>1.8</java.source-target.version> 
    <aspectj.version>1.8.10</aspectj.version> 
    </properties> 

    <build> 

    <pluginManagement> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.5.1</version> 
      <configuration> 
      <source>${java.source-target.version}</source> 
      <target>${java.source-target.version}</target> 
      <!-- IMPORTANT --> 
      <useIncrementalCompilation>false</useIncrementalCompilation> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.10</version> 
      <configuration> 
      <!--<showWeaveInfo>true</showWeaveInfo> --> 
      <source>${java.source-target.version}</source> 
      <target>${java.source-target.version}</target> 
      <Xlint>ignore</Xlint> 
      <complianceLevel>${java.source-target.version}</complianceLevel> 
      <encoding>${project.build.sourceEncoding}</encoding> 
      <!--<verbose>true</verbose> --> 
      <!--<warn>constructorName,packageDefaultMethod,deprecation,maskedCatchBlocks,unusedLocals,unusedArguments,unusedImport</warn> --> 
      </configuration> 
      <executions> 
      <execution> 
       <!-- IMPORTANT --> 
       <phase>process-sources</phase> 
       <goals> 
       <goal>compile</goal> 
       <goal>test-compile</goal> 
       </goals> 
      </execution> 
      </executions> 
      <dependencies> 
      <dependency> 
       <groupId>org.aspectj</groupId> 
       <artifactId>aspectjtools</artifactId> 
       <version>${aspectj.version}</version> 
      </dependency> 
      <dependency> 
       <groupId>org.aspectj</groupId> 
       <artifactId>aspectjweaver</artifactId> 
       <version>${aspectj.version}</version> 
      </dependency> 
      </dependencies> 
     </plugin> 
     </plugins> 
    </pluginManagement> 

    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>aspectj-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 

    </build> 

    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>${aspectj.version}</version> 
     </dependency> 
     <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.1-901.jdbc4</version> 
     </dependency> 
     <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.17</version> 
     </dependency> 
    </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     </dependency> 
     <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     </dependency> 
     <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     </dependency> 
    </dependencies> 

</project> 

Log4J的配置文件:

# Root logger option 
log4j.rootLogger=INFO, stdout 

# Direct log messages to stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

驅動程序:

package com.company.app; 

public class Application { 
    public static void main(String[] args) { 
    new Application().doSomething("foo", 11); 
    } 

    public String doSomething(String string, int i) { 
    return "blah"; 
    } 
} 

改進方面:

加載logging.properties的方式只能在JAR中使用,但不能在IDE中運行代碼時使用。我建議你依賴從Maven項目正確導入的類路徑,將配置文件放在src/main/resources之下,然後通過ClassLoader.getResourceAsStream(..)打開它。

package com.company.aspect; 

import org.apache.log4j.Logger; 
import org.apache.log4j.PropertyConfigurator; 

public aspect LoggingAspect { 
    private static final Logger logger = Logger.getLogger("com.company"); 

    public LoggingAspect() { 
    PropertyConfigurator.configure(
     Thread 
     .currentThread() 
     .getContextClassLoader() 
     .getResourceAsStream("logging.properties") 
    ); 
    } 

    pointcut tracing() : 
    call(public * com.company..*.*(..)) && 
    !within(LoggingAspect); 

    before() : tracing() { 
    logger.info("Entering: " + thisJoinPointStaticPart.getSignature()); 
    } 

    after() : tracing() { 
    logger.info("Exiting: " + thisJoinPointStaticPart.getSignature()); 
    } 
} 

控制檯日誌:

2017-04-02 17:58:06 INFO company:23 - Entering: String com.company.app.Application.doSomething(String, int) 
2017-04-02 17:58:06 INFO company:27 - Exiting: String com.company.app.Application.doSomething(String, int) 
+0

仍然沒有。我不明白。我使用java.util.logging。它不使用方面 – Mocktheduck

+0

我做了你所提到的一切。我只是應該正常運行的程序?原因Im做它,它仍然沒有工作 – Mocktheduck

+0

這是一些這類的笑話?你真煩我:你已經使用的Log4J顯示我POM和方面的代碼,現在你說你正在使用Java記錄?爲什麼你讓我做這個工作來修復你的Log4J設置呢?只需複製並粘貼我的整個代碼,並將所有內容放入正確的Maven目錄中,然後從這些源中導入新項目,並開心。如果你不喜歡Log4J,你仍然可以使用'System.out.println'或任何你喜歡的東西。我離開這裏,我不喜歡浪費我的時間與那些無法下定決心的人浪費我的時間。我的示例代碼適用於Eclipse和IDEA。再見。 – kriegaex