title: Relocating AspectJ packages in a Java agent
body: <p>I'm using AspectJ to monitor field access and field modify. I have a gradle project that compiles the two aspects and package that jar together with the aspectjrt and aspectjweaver in a shaded jar using gradle shadow plugin.
  the agent is still org.aspectj.weaver.loadtime.Agent.
  everything works fine, but when i try to relocate the aspectj packages I get an error.</p>
  
  <p>The shadow plugin configuration is:</p>
  
  <pre><code>shadowJar {
      relocate 'org.aspectj', 'shadow.org.aspectj'
      relocate 'aj.org.objectweb.asm', 'shadow.aj.org.objectweb.asm'
  }
  </code></pre>
  
  <p>The manifest :</p>
  
  <pre><code>jar {
      manifest {
          attributes("Premain-Class": "shadow.org.aspectj.weaver.loadtime.Agent",
                  "Can-Redefine-Classes": true,
                  "Can-Retransform-Classes":true)
      }
  }
  </code></pre>
  
  <p>This is the decompiled aspect class so it seems correct:</p>
  
  <pre><code>package com.vfunction.singletonanalysis;
  
  import shadow.org.aspectj.lang.JoinPoint;
  import shadow.org.aspectj.lang.NoAspectBoundException;
  import shadow.org.aspectj.lang.annotation.Aspect;
  import shadow.org.aspectj.lang.annotation.Before;
  
  @Aspect
  public class StaticFieldBeforeAccessAspect extends AbstractFieldAccessAspect {
      public StaticFieldBeforeAccessAspect() {
      }
  
      @Before("callAt()")
      public void before(JoinPoint joinPoint) throws Throwable {
          this.printJoinPoint(joinPoint);
      }
  
      public static StaticFieldBeforeAccessAspect aspectOf() {
          if (ajc$perSingletonInstance == null) {
              throw new NoAspectBoundException("com.vfunction.singletonanalysis.StaticFieldBeforeAccessAspect", ajc$initFailureCause);
          } else {
              return ajc$perSingletonInstance;
          }
      }
  
      public static boolean hasAspect() {
          return ajc$perSingletonInstance != null;
      }
  
      static {
          try {
              ajc$postClinit();
          } catch (Throwable var1) {
              ajc$initFailureCause = var1;
          }
  
      }
  }
  </code></pre>
  
  <p>But I still get an error when trying to run a test program saying the the type found is not an aspect:</p>
  
  <pre class="lang-none prettyprint-override"><code>[AppClassLoader@18b4aac2] info AspectJ Weaver Version 1.8.12 built on Friday Oct 20, 2017 at 21:58:11 GMT
  [AppClassLoader@18b4aac2] info register classloader sun.misc.Launcher$AppClassLoader@18b4aac2
  [AppClassLoader@18b4aac2] info using configuration file:***/workspace/singleton-analysis/agent/build/libs/agent-1.0.0-SNAPSHOT-all.jar!/META-INF/aop.xml
  [AppClassLoader@18b4aac2] info register aspect com.vfunction.singletonanalysis.StaticFieldModifyAspect
  [AppClassLoader@18b4aac2] error The specified aspect 'com.vfunction.singletonanalysis.StaticFieldModifyAspect' cannot be found
  [AppClassLoader@18b4aac2] info register aspect com.vfunction.singletonanalysis.StaticFieldAccessAspect
  [AppClassLoader@18b4aac2] error The specified aspect 'com.vfunction.singletonanalysis.StaticFieldAccessAspect' cannot be found
  [AppClassLoader@18b4aac2] info register aspect com.vfunction.singletonanalysis.StaticFieldBeforeAccessAspect
  [AppClassLoader@18b4aac2] error Cannot register 'com.vfunction.singletonanalysis.StaticFieldBeforeAccessAspect' because the type found with that name is not an aspect
  </code></pre>