2011-02-23 17 views
15

Nuestro proyecto usa XJC para generar clases de Java desde un XSD. Estoy usando Java EE 6.JAXB XJC ¿Es posible suprimir la creación de comentarios en las clases generadas?

Cuando todos los XSDs que tenemos son re-generados, las clases generadas incluyen este comentario en la parte superior del archivo:

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

¿Es posible suprimir este comentario ? La razón es que usamos SVN para el control de versiones, y cada vez que regeneramos nuestras clases, cada archivo se muestra como cambiado en SVN, aunque lo único que difiere es este comentario. Así que me gustaría eliminar el comentario por completo si es posible.

Hay una directiva -no-header, pero no quiero eliminar todo el encabezado, para que las generaciones futuras sepan que se trata de un archivo generado a partir de una herramienta, y que las modificaciones se sobrescribirán. Solo quiero eliminar la marca de tiempo. (O como alternativa, quitaría el encabezado incorporado y luego insertaría mi propio encabezado de alguna manera.)

Respuesta

3

Si no es posible usar una opción, puede procesar los archivos generados usted mismo. Para un caso de uso muy específico, tuvimos que hacerlo de esa manera en nuestro proyecto ... Usamos Maven y ejecutamos un script específico después de que las clases de Java han sido generadas y antes de compilarlas y empacarlas en un JAR distribuible.

14

estoy usando este plugin mvn que sustituye a la línea de // 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> 
+1

Esta solución es excelente, pero ¿qué haces para la clase ObjectFactory? Cada vez que lo genera, sus métodos se mueven aleatoriamente ... – unixorn

+0

¿Por qué lo ejecutó durante la fase 'prepare-package' en lugar de la fase' generate-sources'? Su versión modificaría las fuentes después de la compilación ... –

3

para construir sobre la respuesta de CATA (upvoted) la maven-replacer-plugin es el camino a seguir. He encontrado lo siguiente que elimina todo el comentario (no solo la marca de tiempo) que puede reemplazar con su comentario de archivo (licencia, etc.).

<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> 

El Gotcha a tener en cuenta es que el elemento <value> trata el texto literalmente. Entonces, si quiere un salto de línea en su texto de reemplazo, necesita poner un salto de línea en su archivo pom.xml (como lo he demostrado anteriormente).

3

Si utiliza hormiga, el siguiente fragmento puede ser útil para la sustitución de los comentarios:

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

Gracias, fue muy útil :-) – mmey

4

Sé que esto es de 2 años después del hecho, sino porque se generan las clases que no son necesariamente Necesario en SVN. Lo que debe estar en SVN es el esquema o cualquier archivo que utilice para el origen para generar las clases. Siempre que tengas la fuente y las herramientas para generar las clases, las clases en SVN son redundantes y, como pudiste ver, son problemáticas en SVN o en cualquier SCCS. Así que ponga el archivo de esquema en SVN y evite el problema por completo.

1

Lo que debe usted:

Generar sus clases en blanco:

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

Si se agrega a la lista de destino (SVN) ignorar, eso es todo.

2

Llego tarde a la fiesta, pero desde la versión 2.0 del jaxb2-maven-plugin, hay una opción de configuración noGeneratedHeaderComments.(Ver el JAXB-2 Maven Plugin Docs)

Usted puede utilizar de esta manera:

... 
<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> 
... 

Así que no hay necesidad de otro plugin o secuencia de comandos para ejecutar.

Si desea mantener un descargo de responsabilidad, puede utilizar una de las técnicas ya mencionadas para inyectarlo donde lo desee.

Cuestiones relacionadas