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

В нашем проекте используется XJC для генерации классов Java из XSD. Я использую JAVA EE 6.

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

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

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

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

Ответ 1

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

Ответ 2

Я использую этот mvn-плагин, который заменяет строку // 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>

Ответ 3

Я опаздываю на вечеринку, но начиная с версии 2.0 jaxb2-maven-plugin, есть опция конфигурации noGeneratedHeaderComments. (см. Документацию по подключаемым модулям JAXB-2 для Maven)

Вы можете использовать это так:

...
<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxb2-maven-plugin</artifactId>
        <version>2.3.1</version>
        <executions>
            <execution>
                <id>xjc</id>
                <goals>
                    <goal>xjc</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <target>2.1</target>
            <sources>
                <source>FirstXSD.xsd</source>
                <source>SecondXSD.xsd</source>
            </sources>
            <xjbSources>
                <xjbSource>OptionalBindings.xjb</xjbSource>
            </xjbSources>
            <noGeneratedHeaderComments>true</noGeneratedHeaderComments>
        </configuration>
        <dependencies>
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-xjc</artifactId>
                <version>${jaxb.version}</version>
            </dependency>
        </dependencies>
    </plugin>
</plugins>
...

Так что не нужно запускать другой плагин или скрипт.

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

Ответ 4

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

Ответ 5

Чтобы построить ответ на cata (upvoted), 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(как я показал выше).

Ответ 6

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

<replaceregexp
        match="^// Generated on:.*$" 
        replace="// Generated on: [date removed]"
        byline="true">
    <fileset dir="src">
        <include name="**/*.java"/>
    </fileset>
</replaceregexp>

Ответ 7

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

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

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

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

Ответ 8

Я также хочу, чтобы текстовый заголовок с предупреждением о классах создавался автоматически и не должен изменяться вручную, но поскольку я помещаю такие файлы в 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. Просто скопируйте этот файл (из репозитория по ссылке или просто из фляги соответствующей версии, которую вы используете) в 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="#" onclick="location.href='https://javaee.github.io/jaxb-v2/'; return false;">https://javaee.github.io/jaxb-v2/</a> \n\
    Any modifications to this file will be lost upon recompilation of the source schema. \n

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

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