2017-09-06 20 views
0

起動時にClassNotFoundExceptionでアプリケーションが失敗するという問題を説明するために、この単純なSpring起動アプリケーションを作成しました。Spring起動時のAspectJが起動時にClassNotFoundExceptionを発生させる

のpom.xml

<?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>my.code</groupId> 
    <artifactId>aspectj</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>demo</name> 
    <description>AspectJ test for spring boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.6.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjweaver</artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 


</project> 

DemoApplication.java

@SpringBootApplication 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 
} 

DemoConfiguration.java

@Configuration 
@ComponentScan({"my.code"}) 
@EnableAspectJAutoProxy 
public class DemoConfiguration { 

} 

MyAnnotation.java

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface MyAnnotation { 

} 

MyAnnotationAspect.java

@Aspect 
@Component 
public class MyAnnotationAspect { 
    private Logger logger = LoggerFactory.getLogger(MyAnnotationAspect.class); 
    @Around("@annotation(MyAnnotation)") 
    public Object myAnnotation (ProceedingJoinPoint joinPoint) throws Throwable { 
     logger.debug("Before"); 
     Object proceed = joinPoint.proceed(); 
     logger.debug("After"); 
     return proceed; 
    } 
} 

あなたが推測できるように、私は、AspectJのスプリングAOPを使用してカスタムアノテーションを作成しようとしています。残念ながら、このセットアップでは、春の起動が始まるまで例外が発生します。

Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException 
    at java.net.URLClassLoader.findClass(Unknown Source) ~[na:1.8.0_121] 
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_121] 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) ~[na:1.8.0_121] 
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_121] 
    ... 25 common frames omitted 

Eclipse IDEを使用してクラスパスの依存関係を確認していますが、そこにはaspectjweaver.jarがあります。そして、それは正しいクラスを持っています。

ヒントは歓迎します。

EDIT:EclipseでAspectJコンパイラをインストールしようとしましたが、これは2,3年前の別の質問と同様です。変更はありません。

答えて

0

java-agentを使用してspring-boot-pluginをインストールする必要があります。以下のように設定します。

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration> 
     <executable>true</executable> 
     <jvmArguments> 
      -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 
      -javaagent:${settings.localRepository}/org/springframework/spring-instrument/${spring.version}/spring-instrument-${spring.version}.jar 
     </jvmArguments> 
     <attach>false</attach> 
    </configuration> 
</plugin> 

PS。ローカルリポジトリに依存していることを確認してください。

うまくいけば、あなたの問題を解決するはずです。

0

最後に、この問題の根本原因を見つけました。mavenは、関連するaspectjweaver jarの破損したバージョンをダウンロードしました。物理的に削除したとき(mvn -Uコンパイルがうまくいかず)、ハードドライブから強制的にリロードしてしまいましたが、問題は解決しませんでした。

関連する問題