GameAnvilは、ファイバーベースのサーバーエンジンです。 そのためQuasarライブラリを使用します。ファイバーベースの非同期処理を実行するために、事前に約束された特殊な例外を使用します。もしくは、@Suspendableアノテーション(annotation)を使用することもあります。
throws SuspendExecution
あらかじめ約束されたこのようなコードを解析するために、GameAnvilサーバーコードは必ずQuasarライブラリを利用して、ByteCode Instrumentationを進行する必要があります。ByteCode Instrumentationは2つの方法のうちいずれかを利用して進行できます。
サーバー実行VMオプションの最前面に次のようにQuasarバイナリをjavaagentとして追加します。そうすると、ランタイムでByteCode Instrumentaionを進行します。
-javaagent:MY_PATH\quasar-core-0.7.10-jdk8.jar=bm
-javaagent:MY_PATH\quasar-core-0.8.0-jdk11.jar=bm
[参考]
この項目は、必ずVMオプションの最前面に追加する必要があります。この時、quasar-coreのパスは本人のquasar-coreをコピーしておいたパスに設定してください。*
AOT(ahead-of-time)Instrumentationを進行したい場合は、次の内容をプロジェクトオブジェクト管理ファイル(pom.xml)に追加し、Mavenを通じてサーバーバイナリをpackageやinstall、またはdeployすると、コンパイル完了後にInstrumentationを進行します。この場合、最初の場合と同様にVMオプションでjavaagentは必要ありません。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>instrument-classes</id>
<phase>compile</phase>
<configuration>
<tasks>
<taskdef name="instrumentationTask" classname="co.paralleluniverse.fibers.instrument.InstrumentationTask" classpathref="maven.dependency.classpath"/>
<instrumentationTask>
<fileset dir="${project.build.directory}/classes/" includes="**/*.class"/>
</instrumentationTask>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
// gradle 4.10.3でテスト済み
// apply plugin: 'java-library'
configurations {
quasar
api.setCanBeResolved(true)
}
compileJava {
dependsOn.processResources
doLast {
ant.taskdef(name: 'instrumentation', classname: 'co.paralleluniverse.fibers.instrument.InstrumentationTask', classpath: configurations.api.asPath)
ant.instrumentation(verbose: 'true', check: 'true', debug: 'true') {
fileset(dir: 'build/classes/') {
include(name: '**/*.class')
}
}
}
}