私はプロジェクトで豆のためにjson-schema
を生成するためのgradleプラグインを作成しています。私の目標は、ビルドプロセスの一環としてスキーマを生成して公開することです。手動で更新する必要はありません。プロジェクト依存関係でgradleプラグインがクラスにアクセスできるようにする方法
現在、私はproject.compileJava.inputs.files
を私の仕事に渡し、それを使ってURLClassLoader
を構築します。その後、私はこれらのクラスをschema generatorに渡します。
jsonスキーマが正しく生成されるようにするには、ターゲットアプリケーションからObjectMapper
を使用します。残念ながら、私のObjectMapper
は、ジャックソンHibernate5Module.
を追加します。そのモジュールの深さでは、私のクラスがHibernateProxy,
に割り当て可能かどうかを確認しようとします。HibernateProxy
にはGradleのクラスローダがロードされ、クラスにはURLClassLoader
がロードされます。
私はHibernateモジュールを削除することができましたが、他の同様の状況ではバグが引き続き発生し、プラグインの配布が困難になります。ですから、私は、実行時にgradleのクラスパスまたはデフォルトのクラスローダーに新しいエントリを追加する方法が必要です。
は参考のため、ここでreleventコードスニペットである:対象プロジェクトの
build.gradle
jsonSchema {
classpath = project.compileJava.inputs.files
}
パブリッククラスWriteJsonSchemaはDefaultTask
@TaskAction
public void write() throws ClassNotFoundException, IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Hibernate5Module());
mapper.registerModule(new Jdk8Module());
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
Set<File> files = getClasspath().getFiles();
List<URL> urls = new ArrayList<URL>(files.size());
for(File file : files)
{
urls.add(file.toURI().toURL());
}
URLClassLoader classLoader = new URLClassLoader(urls.toArray(new URL[0]), Thread.currentThread().getContextClassLoader());
JsonSchemaGenerator jsonSchemaGenerator = new JsonSchemaGenerator(mapper);
JsonNode jsonSchema =
jsonSchemaGenerator.generateJsonSchema(classLoader.loadClass("com.example.Widget"));
System.out.println(mapper.writeValueAsString(jsonSchema));
classLoader.close();
}
TLを拡張します。 DR:私は道を必要とするo実行時にgradleのクラスパスまたはデフォルトのクラスローダに新しいエントリを追加する。