2011-01-18 5 views
2


Помимо генерации других исходных файлов, я хочу сгенерировать один заводский класс для классов DAO - DAOFactory.java. Я использую hbmtemplate для этой цели - с моим собственным * .ftl-файлом. Проблема в том, что (как я понимаю правильно) файл создается для каждого объекта в базе данных. Можно ли создать этот файл только один раз?Источник генерации с плагином maven-hibernate3

Часть моего pom.xml:

<execution> 
    <id>hbmtemplate0</id> 
    <phase>generate-sources</phase> 
    <goals> 
    <goal>hbmtemplate</goal> 
    </goals> 
    <configuration> 
    <components> 
    <component> 
    <name>hbmtemplate</name> 
    <outputDirectory>src/main/java</outputDirectory> 
    </component> 
    </components> 
    <componentProperties> 
    <revengfile>/src/main/resources/hibernate.reveng.xml</revengfile> 
    <propertyfile>src/main/resources/database.properties</propertyfile> 
    <jdk5>false</jdk5> 
    <ejb3>false</ejb3> 
    <packagename>my.package.name</packagename> 
    <format>true</format> 
    <haltonerror>true</haltonerror> 
    <templatepath>src/main/resources/reveng.templates/</templatepath> 
    <filepattern>DAOFactory.java</filepattern> 
    <template>DAOFactory.java.ftl</template> 
    </componentProperties> 
    </configuration> 
</execution> 

ответ

1

а) сгенерированный код должен, как правило, не идут в src/main/java !!!! Используйте target/generated-sources/somefoldername (или скорее: ${project.build.directory}/generated-sources/somefoldername) вместо этого! В противном случае ваш сгенерированный код окажется в вашем SCM, и тогда все становится беспорядочным. Как правило: все, что вы редактируете, находится в src, все maven создает или редактирует в цель.

Если Hibernate инструменты не автоматически добавлять сгенерированный исходный каталог в исходных корней компилятора, вы можете сделать это с buildhelper-maven-plugin:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.5</version> 
    <executions> 
     <execution> 
      <id>add-source</id> 
      <phase>process-sources</phase> 
      <goals> 
       <goal>add-source</goal> 
      </goals> 
      <configuration> 
       <sources> 
        <source> 
${project.build.directory}/generated-sources/somefoldername 
        </source> 
       </sources> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

б) Похоже, что вы не можете ограничить его к один класс. Итак, вы можете просто удалить сгенерированные java-файлы, которые вам не нужны. Стандартный способ делать такие действия - использовать плагин antrun:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.6</version> 
    <executions> 
    <execution> 
     <phase>process-sources</phase> 
     <configuration> 
     <target> 
      <delete> 
      <fileset 
       dir="${project.build.directory}/generated-sources/somefoldername" 
       includes="**/*.java" excludes="**/ClassYouWantToKeep.java" /> 
      </delete> 
     </target> 
     </configuration> 
     <goals> 
     <goal>run</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 
+0

около a). Это идеальный вариант, однако бывают случаи, когда это не получается так, например, когда я использую Axis2 для генерации кода webservice, а затем вручную редактирую сгенерированную реализацию заглушки. –

+0

@Adriaan это не должно происходить. Создавайте код или редактируйте код вручную, не смешивайте эти два подхода. Во-первых, сборки становятся невоспроизводимыми. –

+0

Я - нисходящий, потому что ** никогда ** не является абсолютным. См., У меня 1000 таблиц в базе данных buzzy, потребовалось несколько часов, чтобы сгенерировать код, который не изменился. –