JAXB XJC Можно ли подавить создание комментариев в сгенерированных классах?

Наш проект использует XJC для создания классов Java из XSD. Я использую JAVAEE 6.

Когда все XSD, которые у нас есть, сгенерированы повторно, сгенерированные классы включают этот комментарий в верхней части файла:

// Generated on: 2011.02.23 at 02:17:06 PM GMT 

Можно ли подавить этот комментарий? Причина в том, что мы используем SVN для контроля версий, и каждый раз, когда мы перегенерируем наши классы, каждый отдельный файл отображается как измененный в SVN, хотя единственное, что отличается, — это комментарий. Поэтому я хотел бы удалить комментарий вообще, если это возможно.

Существует директива -no-header, но я не хочу удалять весь заголовок, чтобы будущие поколения знали, что это файл, созданный с помощью инструмента, и что изменения будут перезаписаны. Я только хочу удалить временную метку. (Или, в качестве альтернативы, я бы удалил встроенный заголовок, а затем каким-то образом вставил свой собственный заголовок.)


person Matt    schedule 23.02.2011    source источник


Ответы (8)


Если это невозможно с помощью опции, вы можете выполнить постобработку сгенерированных файлов самостоятельно. Для очень специфического варианта использования мы должны были сделать это таким образом в нашем проекте... Мы используем Maven и выполняем определенный скрипт после того, как классы Java были сгенерированы, и до того, как мы скомпилируем и упакуем их в распространяемый JAR.

person reef    schedule 23.02.2011

Я использую этот плагин Maven, который заменяет строку // Generated on: 2011.02.23 at 02:17:06 PM GMT:

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>maven-replacer-plugin</artifactId>
    <version>1.3.8</version>
    <executions>
        <execution> 
            <phase>prepare-package</phase>                          
            <goals>
                <goal>replace</goal>
            </goals>
        </execution>
    </executions>
    <configuration>                         
        <includes>                              
            <include>src/main/java/jaxb/*.java</include>            
        </includes>
        <token>^// Generated on.*$</token>
        <value>// Generated on: [TEXT REMOVED by maven-replacer-plugin]</value>                         
        <regexFlags>
            <regexFlag>MULTILINE</regexFlag>
        </regexFlags>
    </configuration>
</plugin>
person cata    schedule 23.08.2011
comment
Это отличное решение, но что делать с классом ObjectFactory? Каждый раз, когда он генерирует, его методы перемещаются случайным образом... - person unixorn; 13.02.2013
comment
По какой причине вы запустили это на этапе prepare-package, а не на этапе generate-sources? Ваша версия изменит исходники после компиляции... - person Lukas Eder; 24.04.2017


Если вы используете ant, следующий фрагмент может быть полезен для замены комментариев:

<replaceregexp
        match="^// Generated on:.*$" 
        replace="// Generated on: [date removed]"
        byline="true">
    <fileset dir="src">
        <include name="**/*.java"/>
    </fileset>
</replaceregexp>
person tbrugz    schedule 07.06.2013
comment
Спасибо, очень пригодилось :-) - person mmey; 18.12.2013

Я знаю, что это произошло спустя 2 года, но поскольку классы генерируются, они не обязательно нужны в SVN. Что должно быть в SVN, так это схема или любой другой файл, который вы используете в качестве исходного кода для создания классов. Пока у вас есть исходный код и инструменты для создания классов, классы в SVN избыточны и, как вы видели, проблематичны в SVN или любой SCCS. Поэтому поместите файл схемы в SVN и вообще избегайте этой проблемы.

person Mark    schedule 04.03.2015

Чтобы основываться на ответе cata (проголосовали), maven-replacer-plugin это путь. Я придумал следующее, что удаляет весь комментарий (а не только метку времени), который вы можете заменить своим комментарием к файлу (лицензия и т. д.).

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>maven-replacer-plugin</artifactId>
    <executions>
      <execution>
        <phase>prepare-package</phase>
          <goals>
            <goal>replace</goal>
          </goals>                   
        </execution>
      </executions>
      <configuration>
        <!-- assumes your xjc is putting source code here -->
        <includes>
          <include>src/main/java/**/*.java</include>
        </includes>
        <regex>true</regex>
        <regexFlags>
          <regexFlag>MULTILINE</regexFlag>
        </regexFlags>
        <replacements>
          <replacement>
            <token>(^//.*\u000a|^\u000a)*^package</token>
            <value>// your new comment
package</value>
          </replacement>         
        </replacements>
      </configuration>
   </plugin>

Единственный момент, на который следует обратить внимание, это то, что элемент <value> воспринимает текст буквально. Поэтому, если вам нужен разрыв строки в замещающем тексте, вам нужно поместить разрыв строки в файл pom.xml (как я показал выше).

person cyber-monk    schedule 09.09.2011

Что вы должны:

Создайте свои классы в target :

${project.build.directory}/generated-sources

Если вы добавите цель в список игнорирования (svn), то все.

person Drs    schedule 16.12.2016

Я также хочу, чтобы текстовый заголовок с предупреждением о классах генерировался автоматически и не должен был изменяться вручную, но, поскольку я помещаю такие файлы в git, я не хочу, чтобы там всегда менялась дата генерации .

Этот заголовок создан в com.sun.tools.xjc.Options#getPrologComment. По сути, это вызов:

return Messages.format(
            Messages.FILE_PROLOG_COMMENT,
dateFormat.format(new Date()));

Messages.FILE_PROLOG_COMMENT определяется как Driver.FilePrologComment. При дальнейшей отладке я обнаружил, что он использует стандартные пакеты локализации Java.

Итак, чтобы изменить формат заголовка, мы просто можем предоставить нашим свойствам переопределение их значений из MessageBundle.properties.

Мы можем сделать это двумя способами:

  1. Просто скопируйте этот файл (из репозитория по ссылке или просто из jar соответствующей версии, которую вы используете) в src/main/resources/com/sun/tools/xjc/MessageBundle.properties вашего проекта и измените ключ Driver.FilePrologComment по своему усмотрению.
  2. Но в первом случае есть некоторые недостатки - во-первых, вы копируете-вставляете много кода, который не меняете, во-вторых, вы должны обновлять его при обновлении зависимости XJC. Так что лучше я рекомендую поместить его как файл src/main/resources/com/sun/tools/xjc/MessageBundle_en.properties (обратите внимание на суффикс _en в имени файла) и поместить туда только те свойства, которые вы действительно хотите изменить. Что-то типа:
# We want header, but do NOT willing there `Generated on: {0}` part because want commit them into git!
Driver.FilePrologComment = \
    This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.4.0-b180830.0438 \n\
    See <a href="https://javaee.github.io/jaxb-v2/">https://javaee.github.io/jaxb-v2/</a> \n\
    Any modifications to this file will be lost upon recompilation of the source schema. \n

Убедитесь, что этот файл находится в пути к классам компилятора, особенно если вы вызываете его из некоторых плагинов.

Это обычный механизм перевода. См. соответствующий ответ: комментарии JAXB на английском языке в сгенерированном файле

person Hubbitus    schedule 22.01.2019
comment
Мне кажется, что это решение требует, чтобы вы сами создали исходный код XJC перед запуском инструмента. Это решение не работает, например, при использовании подключаемого модуля XJC Maven. Это правильно? - person Lii; 28.10.2020
comment
Нет! Просто поместите такой файл в свой проект. - person Hubbitus; 29.10.2020
comment
Звучит здорово! Но я не понимаю, как мне это сделать. Где я должен поставить MessageBundle_en.properties? Альтернатива 1: Должен ли я поместить его в свой проект приложения в подкаталог с именем src/main/resources/com/sun/tools/xjc/? Альтернатива 2: Должен ли я поместить его в каталог установки XJC? (.m2\repository\org\glassfish\jaxb\jaxb-xjc\2.3.2 в моем случае.) - person Lii; 30.10.2020
comment
Просто поместите его в свой проект, как вы описываете в 1-м варианте. - person Hubbitus; 31.10.2020