JAXB XJC Возможно подавить создание комментариев в сгенерированных классах? - PullRequest
24 голосов
/ 23 февраля 2011

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

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

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

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

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

Ответы [ 8 ]

14 голосов
/ 23 августа 2011

Я использую этот плагин 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>
5 голосов
/ 25 июля 2017

Я опаздываю на вечеринку, но начиная с версии 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 голосов
/ 04 марта 2015

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

3 голосов
/ 08 июня 2013

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

<replaceregexp
        match="^// Generated on:.*$" 
        replace="// Generated on: [date removed]"
        byline="true">
    <fileset dir="src">
        <include name="**/*.java"/>
    </fileset>
</replaceregexp>
3 голосов
/ 09 сентября 2011

Для построения ответа 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 (как я продемонстрировал выше).

3 голосов
/ 23 февраля 2011

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

2 голосов
/ 17 декабря 2016

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

Генерация ваших классов в цель:

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

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

0 голосов
/ 23 января 2019

Я также хочу, чтобы чтобы текстовый заголовок с предупреждением о классах был сгенерирован автоматически и не должен изменяться вручную, но поскольку я помещаю такие файлы в int 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="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 английские комментарии в сгенерированном файле

...