2017-10-19 3 views
0

私はプロジェクトで豆のために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のクラスパスまたはデフォルトのクラスローダに新しいエントリを追加する。

答えて

0

気になる人は、compilejavaタスクの出力を調べて、プロジェクトのクラスパスを取得することになりました。

classpath = getProject().files(); 
    getProject() 
     .getTasksByName("compileJava", true) 
     .forEach(task -> classpath = Classpath.plus(((JavaCompile)task).getClasspath())); 
classpath = Classpath.plus(getProject().getTasks().getByName("jar").getOutputs().getFiles()); 
関連する問題