2017-04-01 1 views
0

Grundsätzlich habe ich eine normale Java-App, mit einem Haupt. Ich benutze Intelij Ultimate. Ich habe folgendes pomKann meinen Aspekt nicht ausführen

<?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> 

Also ich habe auch eine LoggingAspect, die ich einfach nicht herausfinden, wie man läuft. Ich versuchte das auch http://confluence.jetbrains.com/display/~roman.shevchenko/AspectJ+Support+Plugin

Und manuell heruntergeladen das Glas, aber ich habe auch heruntergeladen die Intelij Plugins für Aspects. Wie AspectJ Support und Spring Aspect.

Mein Aspekt Klasse sieht wie folgt aus:

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()); 
    } 
} 

Wie Sie sehen können. Ich möchte die java.util.logging.Logger verwenden und ich habe eine logging.properties-Datei, wo ich die Ausgabedatei eingerichtet. Ich habe versucht, die App wie in dem Link, den ich oben eingefügt habe, zu kompilieren und die App normal laufen zu lassen, nichts scheint zu funktionieren. Mein Aspekt funktioniert überhaupt nicht/es wird nicht benutzt. Irgendein Rat? Fehle ich etwas?

Ich möchte Spring Aspekt mit Anmerkungen noch nicht verwenden. Ich kann nicht herausfinden, wie man das zuerst funktioniert

Ich änderte meinen Compiler zu AJC und testete die Verbindung, alles ist in Ordnung. Ich habe Aspectjrt zu Abhängigkeiten hinzugefügt ... es tut immer noch nichts, wenn ich versuche, das Programm auszuführen. Es läuft nur normal, ohne die Aspekte anzuwenden. Irgendwelche Ideen?

+0

Haben Sie compile- oder Ladezeit Weben verwendet werden soll? Meine Antwort hängt von dir ab. Und noch eine kurze Frage zur Bestätigung: AspectJ ist ein neues Thema für Sie, nehme ich an? – kriegaex

+0

Ja, es ist ein neues Thema und ich kann keine guten Materialien finden, um es zu lesen. Ich möchte mein Programm ausführen und die Protokolle in der Datei abrufen, während ich die App ausführe. Ich nehme an, ich möchte die Ladezeit richtig weben? – Mocktheduck

+0

Es gibt eine Menge gutes Material da draußen. Beginnen Sie mit der [AspectJ Dokumentation] (https://eclipse.org/aspectj/docs).php) und, wenn Sie vorhaben, Maven zu verwenden, um Ihr Produkt durch Compile-Time Weben zu bauen, die [AspectJ Maven Plugin Dokumentation] (http://www.mojohaus.org/aspectj-maven-plugin/). Da Sie sich unsicher sind, empfehle ich CTW, nicht LTW. Wenn Sie einverstanden sind, kann ich Ihnen ein Beispiel Maven POM zur Verfügung stellen, um Ihren Beispielcode zu erhalten. – kriegaex

Antwort

1

Dies ist eine Lösung zum Kompilieren Weben. Da alle wichtigen IDEs Projekte von Maven importieren und aktualisieren können, funktioniert es in Eclipse, IntelliJ IDEA und wahrscheinlich auch NetBeans (nie probiert).

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 Konfigurationsdatei:

# 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 

Treiber Anwendung:

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"; 
    } 
} 

Verbesserter Aspekt: ​​

Die Art, wie Sie logging.properties laden, funktioniert nur innerhalb eines JAR, aber nicht, wenn Sie Code von Ihrer IDE ausführen. Ich schlage vor, dass Sie sich darauf verlassen, dass der Klassenpfad korrekt aus dem Maven-Projekt importiert wird, indem Sie die Konfigurationsdatei unter src/main/resources platzieren und dann über ClassLoader.getResourceAsStream(..) öffnen.

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()); 
    } 
} 

Konsolenprotokoll:

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

immer noch nichts. Ich verstehe es nicht. Ich benutze die java.util.logging. Es verwendet nicht die Aspekte – Mocktheduck

+0

Ich habe alles gemacht, was Sie erwähnt haben. Soll ich das Programm nur normal laufen lassen, weil ich es mache und es immer noch nicht funktioniert – Mocktheduck

+0

Ist das eine Art Scherz? Du nervst mich wirklich: Du hast mir mit Log4J einen POM- und Aspect-Code gezeigt und nun sagst du, dass du Java Logging verwendest? Warum hast du mich dazu gebracht, das Log4J-Setup zu reparieren? Kopieren Sie einfach meinen gesamten Code und fügen Sie alles in die richtigen Maven-Verzeichnisse ein, importieren Sie dann ein neues Projekt aus diesen Quellen und seien Sie glücklich. Wenn Sie Log4J nicht mögen, können Sie 'System.out.println' oder was auch immer Sie bevorzugen verwenden. Ich bin weg von hier, ich verschwende meine Zeit nicht gerne mit Leuten, die sich nicht entscheiden können, was sie wollen. Mein Beispielcode funktioniert mit Eclipse und IDEA. Bis bald. – kriegaex