Подавлять предупреждения компилятора о сгенерированных классах JAXB
Возможно, это дубликат этого вопроса ( избегая предупреждений компилятора о коде, сгенерированном xjc), но, поскольку я не очень хорошо разбираюсь в особенностях XJC/JAXB пользовательских привязок, я предполагаю, что, возможно, я неправильно понял упомянутый вопрос.
Мой вопрос кажется достаточно простым - как я могу добавить @SuppressWarnings("all")
аннотации к сгенерированному классу JAXB? У нас 0 политик предупреждений в нашем проекте, и после шага генерации JAXB мы получаем 350+ предупреждений, которые просто ужасны.
Я ожидал бы либо простой флаг на XJC, либо, по крайней мере, простой способ предоставить такую информацию, но я не могу ее найти.
Из того, что я видел в своих путешествиях, люди делают одну из следующих вещей:
- JAXB2 Annotate Плагин @ lexicore, который, согласно примерам, кажется, делает свою работу, но добавляет целую среду и сотни килобайт кода, просто чтобы добавить простую аннотацию к группе классов? В самом деле??,
- Пользовательские привязки JAXB (я могу ошибаться, но это кажется очень загадочным, и я не совсем уверен, возможно ли это сделать таким образом),
- Пользовательская цель ANT, которая будет выполнять генерацию после JAXB поиска и замены,
- Eclipse 4+, похоже, имеет возможность отфильтровывать предупреждения по выбранным проектам, но по разным историческим / традиционным причинам мы застряли в Eclipse 3.7.2 (Indigo),
- Пользовательский плагин XJC, который будет делать вставку аннотации (как предложено одним из комментаторов, см. Здесь),
- Поместить все сгенерированные классы в JAR, сделать JAR зависимостью проекта, а затем полностью удалить сгенерированный код.
Ранее мы занимались этим, помещая связанный с XML код в отдельный проект Eclipse, а затем отключая предупреждения / ошибки в проекте. Теперь, как часть консолидации / рефакторинга кода, мы перетасовали все вокруг и больше не можем позволить себе такую роскошь.
Неужели не существует элегантного решения для такой, казалось бы, тривиальной проблемы? Любые отзывы / мысли с благодарностью.
FWIW, наш проект использует Ant в качестве системы сборки.
2 ответа
Вы должны использовать этот плагин: 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>
Отказ от ответственности: я являюсь автором jaxb2-annotate-plugin, упомянутого в ответе @ToYonos.
Это не отдельный ответ, а скорее дополнение к ответу @ToYonos.
Я хотел бы обратиться к следующему пункту из вопроса.
- Плагин Annox из фреймворка / проекта Atlasian JAXB2 Basics (в соответствии с примерами, похоже, делает свою работу, но добавляет целую фреймворк и сотни килобайт кода, просто чтобы добавить простую аннотацию к группе классов? Действительно??),
Мне просто нужно добавить несколько заметок:
- Прежде всего, это не фреймворк / проект Атлассиана. Я не являюсь сотрудником и не связан ни с Atlassian, ни с Sun, ни с Oracle (хотя я и являюсь официальным участником Sun/Oracle). Это независимый проект с открытым исходным кодом, которым не руководит ни одна компания.
- Следующий,
jaxb2-annotate-plugin
был перенесен в отдельный проект, он больше не является частью Основ JAXB2. Он просто стал слишком большим и заслуженным, чтобы быть отдельной вещью. - По поводу "целого фреймворка и сотен килобайт кода".
jaxb2-annotate-plugin
не требует и не добавляет каких-либо зависимостей времени выполнения в ваш код. Если ваши аннотации сохраняются во время выполнения, вам понадобятся классы ваших аннотаций во время выполнения, но это должно быть очевидно.jaxb2-annotate-plugin
действительно имеет ряд зависимостей времени компиляции, таких как javaparser, который используется для анализа аннотаций из синтаксиса Java. Ну, это связано с тем, что плагин должен делать много умеренно продвинутых вещей, таких как анализ аннотаций из синтаксиса Java и преобразование их в кодовую модель для добавления в сгенерированный код. Лично я не думаю, что несколько сотен килобайт во время компиляции - это вообще проблема.
Так что, с моей точки зрения, @ToYonos предложил разумный обходной путь на данный момент.
Теперь, как будет выглядеть правильное исправление?
- Правильным исправлением будет исправление XJC. Все остальное просто обходной путь.
- Существует проблема JAXB-1053 для этой проблемы. Ярослав верно указывает, что пока
1.6
должно быть поддержано, алмазное исправление не может быть применено. - CodeModel также необходимо обновить для поддержки конструкций Java 7+.
- Вы могли бы помочь, подписав и предоставив PR-код для XJC на GitHub. Однако я не могу сказать, что пиарщики действительно применяются. Три моих пиара находятся в стадии разработки, уже месяц или около того.
- Можно написать плагин XJC, который бы отменял генерацию кода. Это не легко, но возможно.
Правильное исправление не выглядит легкой задачей, я бы предпочел обходной путь и подождал пока исправление поставщика.