ファイルが異なるか、Javaプログラムの「ファイル」に関するストーリー

Javaプログラマーの実践では、アプリケーションの再パッケージ化を行わずにプログラムの動作を変更したり、いくつかのクラスを「フック」したり、メトリックを収集したり、ソースコードなしでサードパーティライブラリまたはjdbcドライバーのJavaアプリケーションをテストしたりすることが実際に起こります。 これを行うにはいくつかの方法があります。 jvmでこのような問題を解決できるオープンソースのaspectjスクリプトプロジェクトについて説明します。







aspectj-scriptingについての話はいくつかの出版物にあります。 練習から始めましょう! katの下で、JIRAからxmlおよびjsonファイルにタスクリストをアップロードするために再構築および再コンパイルせずに、maven-changes-pluginの動作を変更





しかし、あなたが戦いに突入する前に、私はあなたがアスペクト指向プログラミングの理論に一般的に精通しており、AspectJライブラリまたは他のAOPフレームワークで働いたことがあると思います。 あなたの意見は、私の仮定がどれほど真実であるか、そして以下の出版物で基本的なことをより詳細に説明すべきかどうかに関するコメントで興味深いものです。

重要な注意:現在の形式のAspectjスクリプトは、JEEまたはOSGIコンテナでは機能しません。 しかし同時に、マイクロサービスとスタンドアロンJavaアプリケーションはうまく機能し、エージェントと連携します。



Aspectj-scriptingは、AspectJ Load-time Weaving(LTW)ベースのJavaツールエージェントであり、MVELスクリプト言語でアスペクトを記述し、実行時にMavenリポジトリからクラスをロードおよびインスタンス化し、AspectJ構文を使用してポイントカットを記述し、スクリプトアスペクトのライフサイクルをサポートできます。



ここで、ファイル処理の部分について少し説明します。 maven-changes-pluginの便利な機能の1つは、リリースの新機能に関するレポート、JIRA、github、またはtrackからの情報に基づくバグ修正を生成することです。







また、このプラグインがhtmlレポートだけでなく、それがコストをかけるソースデータも保存した場合、maven-changes-pluginのすべてが正常に動作します。 JIRAからのこのデータと特定のブランチのバージョン管理システムのログに基づいて、優れたリリースノートを作成できます。 手作業を避け、JIRAのみに基づいてレポートをコンパイルする際に何かが抜け落ちることを恐れないでください。



プラグインコードを調べると、以前はJIRAのRESTサービスを使用する前に、そのようなファイルをXML形式で生成できることがわかりました。 しかし、RESTとjqlのバージョン2.11では、そのような可能性はありません。 ただし、同時に、タスクリストはorg.apache.maven.plugin.jira.AbstractJiraDownloader.getIssueList()メソッドから返されるため、シリアル化してファイルに保存すると便利です。



すぐに言ってやった! aspect.xmlファイルにエージェントの構成を記述します。 そして、プロセスの説明の後、その仕組みを説明します。



<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <configuration> <aspects> <name>org.maven.plugin.changes.Dump</name> <type>AROUND</type> <pointcut>execution(* org.apache.maven.plugin.jira.AbstractJiraDownloader.getIssueList(..))</pointcut> <artifacts> <artifact>com.google.code.gson:gson:2.3.1</artifact> <classRefs> <variable>GsonBuilder</variable> <className>com.google.gson.GsonBuilder</className> </classRefs> </artifacts> <artifacts> <artifact>com.thoughtworks.xstream:xstream:1.4.8</artifact> <classRefs> <variable>XStream</variable> <className>com.thoughtworks.xstream.XStream</className> </classRefs> </artifacts> <artifacts> <artifact>commons-io:commons-io:2.4</artifact> <classRefs> <variable>FileUtils</variable> <className>org.apache.commons.io.FileUtils</className> </classRefs> </artifacts> <process> <expression> import java.io.File; res = joinPoint.proceed(); gson = new GsonBuilder().setPrettyPrinting().create(); FileUtils.writeStringToFile(new File("report.json"), gson.toJson(res)); xstream = new XStream(); xstream.alias("issue", org.apache.maven.plugin.issues.Issue); FileUtils.writeStringToFile(new File("report.xml"), xstream.toXML(res)); res; </expression> </process> </aspects> </configuration>
      
      







jsonを好む人のために、この形式で設定を記述することができます。 xmlでアスペクトの複数行の説明を行う方が便利です。



aspectj-scripting-1.0-agent.jarを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>com.github.igor_suhorukov</groupId> <artifactId>jira_report_example</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <issueManagement> <system>jira</system> <url>https://issues.sonatype.org/browse/OSSRH</url> </issueManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-changes-plugin</artifactId> <version>2.11</version> <configuration> <useJql>true</useJql> <jiraUser>*** ***</jiraUser> <jiraPassword>*** ***</jiraPassword> </configuration> </plugin> </plugins> </build> </project>
      
      







コンソールでmavenの環境変数を設定し、aspectjスクリプトエージェントがjvmにロードされ、aspect.xmlの構成を使用するようにします

 export MAVEN_OPTS="-Dorg.aspectj.weaver.loadtime.configuration=config:file:aspect.xml -javaagent:aspectj-scripting-1.0-agent.jar"
      
      







その後、Mavenプラグインを起動します

 mvn changes:jira-report
      
      







BUILD SUCCESSの後の同じディレクトリには、JIRAからのタスクのリストを持つ2つのファイルが既にあります: report.json、report.xml











それがどうして実現したのか。 まず、アスペクトのポイントカットで指定されたgetIssueList()メソッドを呼び出すと、org.maven.plugin.changes.Dumpがアラウンドアスペクトとして呼び出されます。

  <type>AROUND</type> <pointcut>execution(* org.apache.maven.plugin.jira.AbstractJiraDownloader.getIssueList(..))</pointcut>
      
      







Sonatype Aetherライブラリを使用して、3つのアーティファクトとそれらの推移的な依存関係com.google.code.gson、com.thoughtworks.xstream、commons-ioが中央のMavenリポジトリからダウンロードされます。 アーティファクトごとに、ドロップシップライブラリを使用して個別のクラスローダーが作成されます。



 <artifacts> <artifact>com.google.code.gson:gson:2.3.1</artifact> <classRefs> <variable>GsonBuilder</variable> <className>com.google.gson.GsonBuilder</className> </classRefs> </artifacts> <artifacts> <artifact>com.thoughtworks.xstream:xstream:1.4.8</artifact> <classRefs> <variable>XStream</variable> <className>com.thoughtworks.xstream.XStream</className> </classRefs> </artifacts> <artifacts>
      
      







クラスはクラスローダーからロードされ、変数GsonBuilder、XStream、FileUtilsに保存されます。 これらの変数はMVELスクリプトで利用できます。その構文はjavaに非常に似ています。 このスクリプトにより、これらのクラスを操作し、getIssueList()メソッドの結果をXMLおよびJSON形式でシリアル化し、結果をファイルに書き込むことができます。



  res = joinPoint.proceed(); //      org.apache.maven.plugin.jira.AbstractJiraDownloader.getIssueList() // List<org.apache.maven.plugin.issues.Issue> gson = new GsonBuilder().setPrettyPrinting().create(); //     json FileUtils.writeStringToFile(new File("report.json"), gson.toJson(res)); //  pojo  json     commons-io   report.json xstream = new XStream(); //     xml xstream.alias("issue", org.apache.maven.plugin.issues.Issue); //  FileUtils.writeStringToFile(new File("report.xml"), xstream.toXML(res)); //  pojo  xml     commons-io   report.xml res; //     getIssueList()
      
      







エージェントは、中央のMavenリポジトリでアーティファクトとして利用できます。



jvmは、起動時および設定時にjavaエージェントをポイントします。 設定は、httpサーバーまたはファイルからダウンロードできます。 エージェントは、Mavenリポジトリから依存関係をダウンロードし、コードに指示し、プラグインからメソッド呼び出しをインターセプトし、JIRAからjsonおよびxml形式でタスクリストを保存します。 それがすべての魔法です!



aspectj-scriptingがプロジェクトに役立つことを願っています!



All Articles