AspectJ не запускается без аргумента -javaagent

Я пытаюсь использовать AspectJ в простом java-приложении без использования Spring. проект управляется maven.

Вот код проекта, его также можно увидеть на GitHub.

App.java

package ge.jibo.aspectj;

public class App {
    public static void main(String[] args) {
        App app = new App();
        app.print("Message from App object...");
    }

    public void print(String value) {
        System.out.println(value);
    }
}

LoggerAspect.java

package ge.jibo.aspectj;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class LoggerAspect {

    @Around("execution(!static * *(..))")
    public Object dontLogDuplicates(ProceedingJoinPoint thisJoinPoint) throws Throwable {
        System.out.println("Message from LoggerAspect object");
        return thisJoinPoint.proceed();
    }
}

aop.xml в каталоге resources\META-INF

<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
    <aspects>
        <aspect name="ge.jibo.aspectj.LoggerAspect"/>
    </aspects>
    <weaver options="-verbose -showWeaveInfo">
        <include within="ge.jibo.aspectj..*"/>
    </weaver>
</aspectj>

pom.xml

<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>ge.jibo.aspectj</groupId>
    <artifactId>aspectj-demo</artifactId>
    <version>1.0</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.6</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>${maven.compiler.source}</source>
                        <target>${maven.compiler.target}</target>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.0.2</version>
                    <configuration>
                        <archive>
                            <index>true</index>
                            <manifest>
                                <mainClass>ge.jibo.aspectj.App</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

после создания файла mvn install JAR я пытаюсь выполнить JAR с помощью команды java -jar aspectj-demo.jar, но выполняется только объект приложения, LoggerAspect ничего не печатает.

java -jar аспектj-demo.jar

Если я передам аргумент -javaagent с aspectjweaver-1.9.6.jar в JVM, то объект Aspect будет выполнен. введите здесь описание изображения

  • Как избежать передачи этого аргумента -javaagent каждый раз?
  • Должен ли я добавить какой-нибудь плагин в pom.xml для прямого выполнения аспекта?

person jiboOne    schedule 15.04.2021    source источник
comment
Вместо этого используйте переплетение во время компиляции, если вам не нравится переплетение во время загрузки. Для этого вы можете использовать плагин AspectJ Maven. Вы можете найти множество примеров в Интернете, многие из них я написал здесь.   -  person kriegaex    schedule 15.04.2021
comment
@kriegaex Спасибо за ответ, можете ли вы дать мне ссылку на один из примеров, который подходит к этому вопросу?   -  person jiboOne    schedule 15.04.2021
comment
Вы пробовали искать здесь или в Интернете? Во-первых, вы должны прочитать о плагине. В его документации также есть примеры использования. Что касается моих ответов об AspectJ Maven здесь, на SO, вы можете искать их, например это. Более простые, содержащие примеры POM, - это этот и тот самый.   -  person kriegaex    schedule 15.04.2021
comment
@kriegaex Я пытался, но ни один из них не работает без передачи аргумента аспекта jweaver.jar во время выполнения.   -  person jiboOne    schedule 15.04.2021
comment
Тогда вы делаете это неправильно. Извините, пробовал, не работает, не подходит для отладки описания проблемы. Мне нужен MCVE либо в обновленном вопросе, либо на GitHub.   -  person kriegaex    schedule 16.04.2021
comment
Кстати, как вы можете ясно видеть в POM, aspectjrt (среда выполнения AspectJ) является зависимостью. Конечно, этот (размер 119 КБ) должен быть в пути к классам, но не aspectjweaver (1,9 МБ). Последний является надмножеством первого и необходим только для LTW. Если вам нравится простота, упакуйте все в исполняемый JAR.   -  person kriegaex    schedule 16.04.2021


Ответы (1)


Простое решение/обходной путь заключался в том, чтобы добавить aspectj-maven-plugin для объединения во время компиляции (в этом случае файл aop.xml больше не нужен)

и упаковать проекты с их зависимостями в исполняемый файл jar с помощью maven-assembly-plugin (есть и другие способы упаковать исполняемый файл jar с библиотеками/зависимостями)

pom.xml

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.11</version>
            <configuration>
                <verbose>true</verbose>
                <complianceLevel>1.8</complianceLevel>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <source>${maven.compiler.source}</source>
                        <target>${maven.compiler.target}</target>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>
                                    ge.jibo.aspectj.App
                                </mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

выполнение mvn install создает дополнительный файл jar aspectj-demo-jar-with-dependencies.jar

java -jar aspectj-demo-jar-with-dependencies.jar введите здесь описание изображения

person jiboOne    schedule 16.04.2021
comment
Здорово, что я смог помочь вам решить вашу проблему. Поскольку вы упомянули другие решения Uber JAR: одним из них будет One-JAR, см. мой ответ здесь. Он также содержит ссылку на другие ответы, в которых я упоминал об этом. Но, конечно, сборка Maven также хороша и, вероятно, более популярна, потому что она активно поддерживается. Я просто привык использовать One-JAR для автономных приложений AspectJ. - person kriegaex; 17.04.2021
comment
Да, ты прав. Ваши комментарии очень помогли решить эту проблему. Спасибо! One-JAR хорош, но если вы переименуете сгенерированный JAR, он больше не будет выполняться должным образом. в случае сборки вы можете без проблем изменить имя. - person jiboOne; 18.04.2021
comment
Что вы имеете в виду, вы не можете переименовать JAR? Если вы говорите о Uber JAR, сгенерированном One-JAR, конечно, вы можете переименовать его, как душе угодно. JRE не заботится об имени JAR. Пожалуйста, уточните вашу проблему. Вы пытаетесь переименовать что-нибудь внутри Uber JAR? Если да, то как и когда? - person kriegaex; 18.04.2021
comment
вы правы, вы можете переименовать его вручную, и он будет работать (проверено). проблема возникает при изменении имени JAR в pom.xml. если вы добавите ‹filename› ${project.build.finalName}.${project.packaging}‹/filename› в плагине с одной банкой, выполнение JAR вызовет исключение java.io.EOFException: Неожиданный конец исключения входного потока ZLIB. - person jiboOne; 19.04.2021
comment
Я никогда так не делаю, но ты можешь. Однако вы не должны использовать одно и то же имя файла как для оригинального артефакта, так и для артефакта с одной банкой, что вы и пытались сделать. Это ошибка. Итак, сначала вы указываете maven-jar-plugin использовать что-то вроде <finalName>${project.build.finalName}.orig</finalName> (без расширения!), в результате чего получается my_artifact-1.2.orig.jar. Затем вы добавляете соответствующий <mainJarFilename>${project.build.finalName}.orig.${project.packaging}</mainJarFilename> плюс <filename>${project.build.finalName}.${project.packaging}</filename> в конфигурацию плагина One-JAR, и все в порядке. - person kriegaex; 19.04.2021