Плагин AspectJ Maven не может скомпилировать мой проект
Я пытаюсь использовать плагин aspectj maven для компиляции проекта с помощью компилятора aspectj, а затем я пытаюсь упаковать классы в "военный" файл. К сожалению, он не работает со следующей конфигурацией (pom.xml):
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>com.liferay.maven.plugins</groupId>
<artifactId>liferay-maven-plugin</artifactId>
<version>${liferay.maven.plugin.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
</execution>
</executions>
<configuration>
<autoDeployDir>${liferay.auto.deploy.dir}</autoDeployDir>
<appServerDeployDir>${liferay.app.server.deploy.dir}</appServerDeployDir>
<appServerLibGlobalDir>${liferay.app.server.lib.global.dir}</appServerLibGlobalDir>
<appServerPortalDir>${liferay.app.server.portal.dir}</appServerPortalDir>
<liferayVersion>${liferay.version}</liferayVersion>
<pluginType>portlet</pluginType>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.7</source>
<target>1.7</target>
<showWarnings>true</showWarnings>
<failOnError>true</failOnError>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilationLevel>1.7</compilationLevel>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.4</version>
<type>jar</type>
</dependency>
После mvn clean install
я вижу следующие исключения:
[INFO] --- aspectj-maven-plugin:1.7:compile (default) @ tvbs-portlet ---
[INFO] Showing AJC message detail for messages of types: [error, warning, fail]
[ERROR] Missing message: configure.incompatibleComplianceForSource in: org.aspectj.ajdt.ajc.messages
<unknown source file>:<no line information>
[ERROR] no sources specified
<unknown source file>:<no line information>
[ERROR] AspectJ Compiler 1.8.2
Usage: <options> <source file | @argfile>..
AspectJ-specific options:
-inpath <list> use classes in dirs and jars/zips in <list> as source
Может кто-нибудь предложить мне какое-то решение?
Ответы
Ответ 1
Обновление. Хотя все, что я сказал о конфигурации AspectJ Maven в этом ответе, является правильным, основная причина конкретной проблемы - плохое управление зависимостями Maven - описана в моем другом ответе. Было бы лучше, если бы этот ответ был принят, а не этот.
- Подсказка для пользователя имеет смысл, пожалуйста, измените ваш
<compilationLevel>
(опечатка?) - на <complianceLevel>
. - Нет необходимости переходить на плагин версии 1.6, вы можете оставить 1.7.
- Также нет необходимости снова указывать конфигурацию в разделе
<execution>
, достаточно одного на уровне плагина. - Обратите внимание, что версия AspectJ по умолчанию в плагине 1.7 - 1.8.2, так что, возможно, ваша зависимость во время выполнения от 1.7.4 работает, но на вашем месте я бы тоже обновил ее, оптимально синхронно с версией плагина. Это не жесткое требование, но я думаю, что оно имеет смысл.
- Может быть, вы даже хотите обновить до текущей версии AspectJ 1.8.4, в плагине, а также во время выполнения. Это также может быть достигнуто путем добавления зависимости к желаемой версии aspectjtools в конфигурацию плагина:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.source-target.version>1.8</java.source-target.version>
<aspectj.version>1.8.4</aspectj.version>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</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>UTF-8</encoding>
<verbose>true</verbose>
</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>
</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>
<scope>runtime</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
</dependencies>
Ответ 2
Похоже, что известная проблема http://jira.codehaus.org/browse/MASPECTJ-125
Вы можете исправить это, добавив следующее в ваш файл pom.
<complianceLevel>1.6</complianceLevel>
Ответ 3
Посмотрев ваш проект Maven https://github.com/dmitrievanthony/test-aspectj, я обнаружил, что
- проблема совершенно не связана с плагином AspectJ Maven,
- такие же ошибки компиляции также происходят в плагине компилятора Maven и
- что основной причиной вашей проблемы является просто плохое управление зависимостями.
Вот скриншот (полный размер здесь) от IntelliJ IDEA "найти класс":
![Class LockModeType is found 3x in the project]()
Как видите, класс LockModeType
находится в 3 (трех!) Зависимостях, одна из которых содержит версию класса, которая не содержит ожидаемых значений перечисления. Ваш код компилируется, если вы удалите эту зависимость.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>ejb3-persistence</artifactId>
<version>1.0.2.GA</version>
</dependency>
Может быть, вы должны очистить свои зависимости. Для этой цели вы можете использовать Maven Dependency Plugin с такими целями, как dependency:analyze
и dependency:tree
.
Ответ 4
После настройки плагина изменений будет работать следующее:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.6</version>
<configuration>
<complianceLevel>1.7</complianceLevel>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<complianceLevel>1.7</complianceLevel>
<source>1.7</source>
<target>1.7</target>
</configuration>
</execution>
</executions>
</plugin>
Но после этого я получаю много разных ошибок компиляции:
[ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.6:compile (default) on project tvbs-portlet: Compiler errors:
[ERROR] error at Entitle.class, entitleId, LockModeType.PESSIMISTIC_WRITE);
[ERROR]
[ERROR] /Users/<...>/ejb/BillingEJB.java:43:0::0 PESSIMISTIC_WRITE cannot be resolved or is not a field
[ERROR] error at .createQuery("select e from Entitle e " +
[ERROR]
[ERROR] /Users/<...>/ejb/EntitleEJB.java:62:0::0 The method createQuery(String) in the type EntityManager is not applicable for the arguments (String, Class<Entitle>)
[ERROR] error at return entityManager.createQuery(
[ERROR] ^^
Может быть причиной неправильных параметров плагина aspectj?
Ответ 5
убедитесь, что модули имеют исходный код, например *.java и т.д.
когда я компилирую CAS на версии 4.0.6, эта ошибка возникает, я обнаружил, что cas-server-uber-webapp не имеет никакого исходного кода в папке src. просто удалите модуль из родительского pom.xml.