2011-10-07 97 views

回答

49

我认为没有最好的实践这一点。在我过去的项目中,我创建了一个单独的目录来存储这样的SQL脚本。

例如src/main/db

它不会被打包在默认情况下最终JAR(这是大多数情况下的首选方式),但它是足够方便让它在组装打包。您甚至可以将它们打包在主工件JAR中,方法是添加相应的资源声明或使用maven build-helper插件。

然而,一切都取决于这个脚本您的使用。不过,我会考虑只有当它们真的是您的应用程序加载的资源时才将它们放入资源中。

+1

从我简单。 – MaDa

+12

我会去src/main/sql类似于src/main/java和src/main/scala,请参阅http://maven.apache.org/pom.html#Resources – MeTTeO

2

我会用src/main/resources用于此目的。也许在那里创建一个子文件夹。

4

src/main/resources是个好地方,但要记住它被打包到最终的jar,所以如果你想在你的产品代码或不向外界透露这个看情况。

如果没有,你可以通过添加的maven-JAR-插件配置摘录到合适pom.xml筛选出这一点:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <configuration> 
     <excludes>src/main/resources/privateSubdir/**</excludes> 
    </configuration> 
</plugin> 
+3

“......但记住它会被打包到你的最终jar中,所以这取决于你是否想在你的生产代码中显示这个。”这是我犹豫将它放入资源目录的确切原因。毕竟,我将“资源”解释为或多或少是JSF2资源目录,您可以从您的库中引用(从网页引用),因此SQL脚本在此方面并不完全合格。 – Kawu

+0

@Kawu在这种情况下,最好将这些东西完全放在Maven项目目录之外 - 尽管我不会为了方便起见而将它们移动。 – MaDa

+0

完全同意。我们通常将这些保存在src/main下的单独文件夹中,因此他们从来没有机会错误地将其包含在构建产品中。我喜欢你的过滤器想法,尽管@MaDa – Perception

21

我认为这完全取决于何时以及如何将这些脚本处理上:

  1. 编译时:这些都是你的编译器/工具链消费和生产的工件。在这个非常清晰的行家指导,因此文件将某处属于在src/main/,像src/main/sqlsrc/main/db。虽然我不会这样做,但我可以看到这些被编译中的任务用来修改您的数据库。我可以看到在这里使用liquibase脚本,然后通过maven任务执行。
  2. 运行:这些都是由运行时环境中使用,要么修改它,或者将其消耗产生的结果。将它们放置在src/main/resources似乎是合理的,使你的运行过程中会消耗他们改变你的数据库,你认为合适 - 也就是说,作为您的热修复处理的一部分上部署,或作为您的正常DB的一部分,在即时版本的努力。再次,也许你用你的应用发布liquibase,然后以这种方式进行就地数据库更改...
  3. 设计时间:这在我看来是最有可能的场景。我应该在哪里存储我的DDL以便在VCS中正确地跟踪它们,并且仍然保持我的符合Maven的结构?对我而言,这是src/scripts/sqlsrc/scripts/db。这将它们作为maven的权限范围内的“源”文件,但在一个旨在用于更特别的方式的地方。
0

这很大程度上取决于你的里程数,但首先将应用程序与底层数据库结构分开是个好主意。因此,我建议你将所有数据库相关的东西移到一个单独的Maven项目中。完成之后,数据库脚本在/ src/main/scripts中有一个很好的插槽。

相关问题