9

これはおそらくこの質問 ( xjc によって生成されたコードでコンパイラの警告を回避する ) の複製ですが、私は XJC/JAXB カスタムバインディングの特異性にあまり精通していないため、言及された質問を誤解した可能性があると推測します。

@SuppressWarnings("all")私の質問は単純に思えます -生成された JAXB クラスに注釈を追加するにはどうすればよいですか? 私たちのプロジェクトには警告ポリシーがありません。JAXB 生成ステップの後、ひどいノイズである 350 以上の警告が表示されます。

XJC の単純なフラグか、少なくともそのような情報を提供する簡単な方法のいずれかを期待しますが、何も見つかりません。

私が旅行中に見たことから、人々は次のいずれかを行っています。

  1. 例によると、 @lexicoreのJAXB2 Annotate Pluginは仕事をしているように見えますが、一連のクラスに単純な注釈を追加するためだけに、フレームワーク全体と数百kBのコードを追加しますか? 本当??、
  2. カスタム JAXB バインディング (私は間違っているかもしれませんが、これは非常に難解なようで、この方法で実行できるかどうかは完全にはわかりません)、
  3. JAXB 生成後の検索と置換を行うカスタム ANT ターゲット
  4. Eclipse 4+ には、選択したプロジェクトの警告をフィルターで除外するオプションがあるようですが、さまざまな歴史的/レガシーの理由により、Eclipse 3.7.2 (Indigo) で立ち往生しています。
  5. 注釈の挿入を行うカスタム XJC プラグイン (コメンターの 1 人が提案したように、ここを参照)、
  6. 生成されたすべてのクラスを JAR に配置し、JAR をプロジェクトの依存関係にしてから、生成されたコードを完全に削除します。

以前は、XML 関連のコードを別の Eclipse プロジェクトに押し込んでから、プロジェクトの警告/エラーを無効にすることで、これに対処していました。現在、コードの統合/リファクタリングの一環として、物事を再編成し、その余裕はなくなりました。

このような一見些細な問題に対するエレガントな解決策は本当にないのでしょうか? フィードバック/考えは大歓迎です。

FWIW、私たちのプロジェクトは Ant をビルドシステムとして使用しています。

4

2 に答える 2

7

このプラグインを使用する必要があります: jaxb2-annotate-plugin

2 ソリューション :

1 - xsd を変更し、この種のブロックを追加します

<xsd:element name="foobar" type="xsd:string">
    <xsd:annotation>
        <xsd:appinfo>
            <annox:annotate>@java.lang.SuppressWarnings("all")</annox:annotate>
        </xsd:appinfo>
    </xsd:annotation>
</xsd:element>

2 - カスタム バインディングを作成する

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:annox="http://annox.dev.java.net"
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    jaxb:extensionBindingPrefixes="xjc annox"
    version="2.1">
    <jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
        <annox:annotate target="class">@java.lang.SuppressWarnings("all")</annox:annotate>
    </jaxb:bindings>
</jaxb:bindings>
于 2014-11-07T10:29:31.840 に答える
5

免責事項:私は@ToYonosの回答に記載されているjaxb2-annotate-pluginの作成者です。

これはスタンドアロンの回答ではなく、@ToYonos の回答への追加です。

質問から次の点を指摘したい。

  1. Atlassian の JAXB2 Basics フレームワーク/プロジェクトの Annox プラグイン (例によると、仕事をしているように見えますが、単純な注釈を多数のクラスに追加するためだけに、フレームワーク全体と数百 kB のコードを追加する必要がありますか?本当に??)、

いくつかのメモを追加する必要があります。

  • まず第一に、これは「アトラシアンの」フレームワーク/プロジェクトではありません。私はアトラシアン、サン、オラクルの従業員でも関係者でもありません (私は公式のサン/オラクルの貢献者ですが)。これは、どの企業も主導していない独立したオープンソース プロジェクトです。
  • 次に、スタンドアローン プロジェクトjaxb2-annotate-pluginに移動され、もはやJAXB2 Basicsの一部ではありません。大きくなりすぎて、スタンドアロンのものにする価値がありました。
  • 「フレームワーク全体と数百 kB のコード」について。
    • jaxb2-annotate-pluginコードに実行時の依存関係を必要とせず、追加することもありません。注釈にランタイム保持がある場合、実行時に注釈のクラスが必要になりますが、それは明らかなはずです。
    • jaxb2-annotate-plugin実際、Java 構文から注釈を解析するために使用されるのような多くのコンパイル時の依存関係があります。これは、プラグインが、Java 構文から注釈を解析し、それらをコードモデルに変換して生成されたコードに追加するなど、中程度に高度な作業を数多く実行する必要がためです。個人的には、コンパイル時間の数百 kB はまったく問題ではないと思います。

したがって、私の観点からすると、@ToYonos は当面の合理的な回避策を提供しました。


さて、正しい修正はどのように見えるでしょうか?

  • 正しい修正は、XJC を修正することです。他のすべては単なる回避策です。
  • この問題にはJAXB-1053の問題があります。1.6Iaroslavは、サポートが必要な限り、ダイヤモンド修正を適用できないことを正しく指摘しています。
  • Java 7+ コンストラクトをサポートするには、CodeModelも更新する必要があります。
  • GitHubでフォークして XJC コードに PR を提供することで、あなたを助けることができます。しかし、PR が実際に適用されるとは言えませんでした。パイプラインには、すでに 1 か月ほど前から、私の PR が 3 つあります。
  • コード生成をオーバーライドする XJC プラグインを作成することは可能です。これは簡単ではありませんが、可能です。

正しい修正は簡単な作業ではないようです。回避策を選択し、現時点ではベンダーの修正を待ちます。

于 2014-11-07T12:28:37.440 に答える