使用scala模型使aspectj工作

时间:2017-04-13 22:29:38

标签: java scala maven aop aspectj

我在Scala中创建了一个域,而在Java中创建了一些类。我需要在Aspectj中创建一些方面,我知道这是有用的,因为使用Java类并且它可以工作。 问题是当Scala类被注释时它不起作用。像hibernate这样的其他注释可以很好地与我的Scala类配合使用。

这是我的pom.xml:

self.navigationcontroller.present(vc2, animated: true)
self.dismiss(animated: false)

我认为我必须对maven做一些事情,因为方面和其余的代码工作正常。 反正有吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,确保您的方面(基于注释或本机语法)始终具有.aj文件扩展名(通过"新方面"而不是&#34将它们添加到您的项目中;您使用的任何IDE中的新类"菜单。我已在我的fork中删除了您的仓库中的重复类,并相应地重命名了另一个。顺便说一下,我选择了原生语法。

更糟糕的是,你在某种程度上期望在特定目录中编写无格式的Scala类,但是你没有配置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 + Scala模块上配置编织依赖关系,将所有类从那里编织到方面模块中。但是,您可能仍然遇到运行测试的问题。但至少你可以配置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] ------------------------------------------------------------------------
(...)

P.S。:我还为您创建了一个pull request,可以轻松地将我的更改整合到您的回购中。

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

答案 1 :(得分:0)

问题很可能是方面通常应用于java代码的语义 - &#34;找到一个名为X的方法,并围绕它执行以下操作。&#34;但是,从Java查看时,Scala代码通常不遵循预期的命名约定。如果没有关于特定切入点的详细信息 - 以及它们应用的代码 - 我无法提供更多信息。