2017-04-13 104 views
0

我有一个在Scala中制作的域和一些用Java制作的类。我需要用Aspectj做一些方面的知识,因为使用Java类,它可以工作。 问题是,当Scala类注释它不起作用。其他注释(如hibernate的)和我的Scala类一起工作良好。使aspectj与scala模型一起工作

这是我的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/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>Group</groupId> 
    <artifactId>Parent</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

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

    <build> 
     <pluginManagement> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>3.6.1</version> 
        <configuration> 
         <source>${java.source-target.version}</source> 
         <target>${java.source-target.version}</target> 
         <useIncrementalCompilation>false</useIncrementalCompilation> 
        </configuration> 
       </plugin> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-antrun-plugin</artifactId> 
        <executions> 
         <execution> 
          <id>createClassesDir</id> 
          <phase>process-resources</phase> 
          <configuration> 
           <tasks> 
            <mkdir dir="${project.build.directory}\unwoven-classes" /> 
            <mkdir dir="${project.build.directory}\classes" /> 
           </tasks> 
          </configuration> 
          <goals> 
           <goal>run</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
       <plugin> 
        <groupId>org.codehaus.mojo</groupId> 
        <artifactId>aspectj-maven-plugin</artifactId> 
        <version>1.7</version> 
        <configuration> 
         <complianceLevel>1.8</complianceLevel> 
         <source>${aspectj.version>}</source> 
         <target>${aspectj.version>}</target> 
         <weaveDirectories> 
          <weaveDirectory>${project.build.directory}\unwoven-classes</weaveDirectory> 
         </weaveDirectories> 
        </configuration> 
        <executions> 
         <execution> 
          <phase>process-classes</phase> 
          <goals> 
           <goal>compile</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
       <plugin> 
        <groupId>net.alchim31.maven</groupId> 
        <artifactId>scala-maven-plugin</artifactId> 
        <executions> 
         <execution> 
          <id>scala-compile-first</id> 
          <phase>process-resources</phase> 
          <goals> 
           <goal>add-source</goal> 
           <goal>compile</goal> 
          </goals> 
         </execution> 
         <execution> 
          <id>scala-test-compile</id> 
          <phase>process-test-resources</phase> 
          <goals> 
           <goal>testCompile</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </pluginManagement> 
    </build> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.aspectj</groupId> 
       <artifactId>aspectjrt</artifactId> 
       <version>${aspectj.version}</version> 
       <scope>runtime</scope> 
      </dependency> 
      <dependency> 
       <groupId>org.scala-lang</groupId> 
       <artifactId>scala-library</artifactId> 
       <version>2.12.1</version> 
      </dependency> 
      <dependency> 
       <groupId>junit</groupId> 
       <artifactId>junit</artifactId> 
       <version>4.12</version> 
       <scope>test</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <modules> 
     <module>Aspects</module> 
    </modules> 
</project> 

我认为我必须做与Maven一些,因为方面和其他代码工作正常。 有没有办法做到这一点?

谢谢!

回答

1

首先,确保您的方面(基于注释的或本机语法)始终有一个.aj文件扩展名(在您使用的任何IDE中,通过“New aspect”而不是“New class”菜单将它们添加到您的项目中) 。我已从fork的回购库中删除重复的课程,并相应地将其重命名为另一课程。顺便说一句,我选择了本地语法。

更糟的,不过,是你有点期待无纺布Scala类特定目录,但你没有配置斯卡拉插件实际上把它们放在那里。我固定,通过增加这个片段:

<configuration> 
    <outputDir>${project.build.directory}/unwoven-classes</outputDir> 
</configuration> 

现在AspectJ的Maven插件发现Scala类那里,对他们进行二进制编织。这解决了您的Java和Scala测试。他们两个在Maven之前都失败了,现在至少Java的一个在IntelliJ中工作,但不是Scala中的一个。这是由于IDEA不知道这个奇怪的Maven安装程序以及您的附加(中间)目录。

因此,有什么不对这样还是AspectJ无法与Scala的二进制工作方面。该项目设置是错误的,并在某种程度上仍然是关于IDE支持。

那么你怎么能完全解决它?您有几种选择:

  • 把方面代码到另一个Maven的模块,有在Java +斯卡拉模块上配置编织依赖,编织从那里所有类进方面模块。但是,你可能仍然在运行测试时遇到问题。但至少你可以将IDEA项目配置为具有正确的依赖关系的后编译编织。
  • 你也可以把Scala代码它自己的模块中代替,其定义为在Java + AspectJ的模块的依赖关系,并应用二进制编织于这种方式。

其它变体是可能的。我不想在这里过度分析,我只是固定你的Maven建立在一个快速和简单的方法让你去:

$ mvn clean verify 

(...) 
------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Aktive Codepage: 65001. 
Running aspects.AnnotationAspectTest 
set(String model.JavaEntity.name) 
set(String model.ScalaEntity.name) 
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 sec 

Results : 

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 

[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ aspectj-with-scala --- 
[INFO] Building jar: C:\Users\Alexander\Documents\java-src\aspectj-with-scala\target\aspectj-with-scala-1.0-SNAPSHOT.jar 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
(...) 

PS:我还创建了一个pull request让你轻松地集成我变成你的回购。

P.P.S .:看,MCVE比你之前做的更有帮助:发布一个单独的问题,只显示一个方面,然后在这里只用Maven POM发布这个问题。为了重现和解决问题,我需要加上其他课程。在你发布GitHub项目之后,找到并修复它非常简单。

+0

非常感谢!这个解决方案对于我上传的项目来说非常完美,我已经接受了pull请求,并对它进行了一些修改,使其成为多模块。感谢您的耐心和帮助! – Motomine

+0

我刚刚发布了我的最后一个问题[here](http://stackoverflow.com/questions/43422025/using-aspectj-when-i-run-the-application-with-tomcat),请你帮我一下如果可能的话?谢谢! – Motomine

+0

对于所有谁可能读这篇文章的人:@ Motomine的多模块的设置被打破,测试所有的IntelliJ IDEA在Maven和我失败了也。如果在我的[fork](https://github.com/kriegaex/aspectj-with-scala)中修复了它,并且还发出了另一个拉取请求。因此,如果有人正在寻找一个支持Scala的AspectJ多模块设置的展示,那么您可以在那里找到它。 – kriegaex

0

的问题是可能的方面却经常被应用到Java代码的语义 - “找到像X中的名称的方法并执行以下操作它周围”但是从Java查看时,Scala代码通常不遵循预期的命名约定。没有更多关于正在制定的具体切入点的细节以及它们正在应用的代码 - 我无法再给出更多的见解。

+0

我同意。正如我在其他问题中所说的,请在GitHub上发布包含代码和构建配置的完整[MCVE](http://stackoverflow.com/help/mcve)。也许我可以通过分析你的设置为你找到解决方案。 – kriegaex

+0

我明白了你的观点,并且我明白了,但是当我使用注释时,我想这可能不会发生。有很多代码,我会暂时上传GitHub,看看你能否帮助我。谢谢 – Motomine

+0

@ kriegaex我刚刚上传了一个完整的例子[这里](https://github.com/tsandler/aspectj-with-scala)。有了这个例子,与Java类作品中运行,而一个与斯卡拉类失败 – Motomine

相关问题