2016-11-24 2 views
1

Я пытаюсь воссоздать поведение, описанное в Уилла blog post но получить следующее исключение на попытке запустить его с помощью:Исключение при вызове из Java агента инструментальными через ByteBuddy

$ java -javaagent:agent/target/securityfixer-agent-1.0-SNAPSHOT.jar=bootstrap/target/securityfixer-bootstrap-1.0-SNAPSHOT.jar -jar example/target/securi 
tyfixer-example-1.0-SNAPSHOT.jar                               
Exception in thread "main" java.lang.NoClassDefFoundError: net/bytebuddy/implementation/Implementation$Context$Factory          
     at java.lang.Class.getDeclaredMethods0(Native Method)                        
     at java.lang.Class.privateGetDeclaredMethods(Unknown Source)                      
     at java.lang.Class.getDeclaredMethod(Unknown Source)                        
     at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(Unknown Source)                  
     at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(Unknown Source)                  
Caused by: java.lang.ClassNotFoundException: net.bytebuddy.implementation.Implementation$Context$Factory             
     at java.net.URLClassLoader.findClass(Unknown Source)                        
     at java.lang.ClassLoader.loadClass(Unknown Source)                         
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)                      
     at java.lang.ClassLoader.loadClass(Unknown Source)                         
     ... 5 more                                   
FATAL ERROR in native method: processing of -javaagent failed 

structure является таким, как описано в Блог Уилла - 3 отдельных банки, один с агентом, один с перехватчиком и один с основным классом.

Я также попытался запустить его как исполняемый банку, добавляя строфу MainClass в манифест securityfixer-примера, но это, кажется, в обход приборов в целом:

$ java -jar example/target/securityfixer-example-1.0-SNAPSHOT.jar -javaagent:agent/target/securityfixer-agent-1.0-SNAPSHOT.jar=bootstrap/target/securityfixer-bootstrap-1.0-SNAPSHOT.jar 
Security manager is set! 
ATTACK SUCCEEDED: Security manager was reset! 

Что я мог не быть здесь? Заранее спасибо.

ответ

1

Следующая установка, кажется, работает:

byte-buddy-1.0.0.jar должен быть внутри java-agents-experiments\securityfixer\agent\target вместе с genarated securityfixer-agent-1.0-SNAPSHOT.jar как последняя зависит от первой. Это достигается за счет включения следующий плагин, который выполняет копирование, в securityfixer-agent/pom.xml:

  <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.8</version> 
       <executions> 
        <execution> 
         <id>copy-dependencies</id> 
         <phase>prepare-package</phase> 
         <goals> 
          <goal>copy-dependencies</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${project.build.directory}</outputDirectory> 
          <includeScope>runtime</includeScope> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 

, а также следующие ссылки в <Boot-Class-Path> к артефакту произведенный выше строфе:

 <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 
        <manifestEntries> 
         <Can-Redefine-Classes>true</Can-Redefine-Classes> 
         <Can-Retransform-Classes>true</Can-Retransform-Classes> 
         <Agent-Class>com.excelsiorsoft.securityfixer.agent.SecurityFixerAgent</Agent-Class> 
         <Premain-Class>com.excelsiorsoft.securityfixer.agent.SecurityFixerAgent</Premain-Class> 
         <Boot-Class-Path>byte-buddy-1.0.0.jar</Boot-Class-Path> 
        </manifestEntries> 
       </archive> 
      </configuration> 
     </plugin> 

таким образом, что ненужные зависимости (например, securityfixer-bootstrap) не копируются указанным выше плагином вместе с byte-buddy-1.0.0.jar Мне нужно было изменить их область действия на provided. maven-dependency-plugin, похоже, пропускает копии с этой областью в папку назначения.

Чтобы иметь возможность запускать его как исполняемый банку нужно добавить <mainClass> строфу securityfixer-example/pom.xml:

 <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>securityfixer.Main</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 

.

$ java -javaagent:agent/target/securityfixer-agent-1.0-SNAPSHOT.jar=bootstrap/target/securityfixer-bootstrap-1.0-SNAPSHOT.jar -jar example/target/securit yfixer-example-1.0-SNAPSHOT.jar 


Security manager is set!  
ATTACK FAILED: SecurityManager cannot be reset! 

Не стесняйтесь прокомментировать - возможно, есть более элегантное решение. Благодаря!

+0

Просто FYI для тех, кто сталкивается с этим, обязательно используйте Byte Buddy версии 1.4.1 или более ранней версии. Начиная с 1.4.2 он больше не работает ... все еще пытается отследить, почему! –

+0

Какая ошибка вы получаете с ver. 1.4.2? –