【问题标题】:@Sql annotation by passing a sql script present in another module通过传递另一个模块中存在的 sql 脚本来进行 @Sql 注释
【发布时间】:2021-10-07 12:46:02
【问题描述】:

我有一个由多个模块组成的项目,以及一个集成测试(在测试文件夹中),我想在其中使用@sql 注释运行此脚本。默认使用类路径资源。

测试在这个文件夹中:

mainFolder/module1/src/test/java/com/.../.../controllers/TestClass.java

当脚本存在于此文件夹中时:

mainFolder/scripts/postgres/script.sql

基本上我不确定应该将哪个字符串(相对路径)放入@Sql 注释的值参数中。

【问题讨论】:

    标签: java spring path


    【解决方案1】:

    恐怕如果你的脚本没有复制到类路径中,那么选项并不多。

    请尝试以下方法:

    @Sql("file:/path-to-mainFolder/mainFolder/scripts/postgres/script.sql")
    

    正如您在documentation 中看到的,您可以使用任何有效的资源类型。

    话虽如此,我认为最好的选择是让这些资源在类路径中可用。如果您使用的是 maven,您可以使用例如 maven resources plugincopy-resources 目标在运行测试时复制您的资源:

    <project>
      ...
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
              <execution>
                <id>copy-resources</id>
                <!-- here the phase you need: validate, test-compile... -->
                <phase>validate</phase>
                <goals>
                  <goal>copy-resources</goal>
                </goals>
                <configuration>
                  <outputDirectory>${basedir}/target/scripts</outputDirectory>
                  <resources>          
                    <resource>
                      <!-- Depending on your project, try defining the scripts src location as you consider more appropriate  -->
                      <directory>mainFolder/scripts/postgres/script.sql</directory>
                    </resource>
                  </resources>              
                </configuration>            
              </execution>
            </executions>
          </plugin>
        </plugins>
        ...
      </build>
      ...
    </project>
    

    通过此设置,现在您可以将脚本位置定义为类路径资源:

    @Sql("/scripts/postgres/script.sql")
    

    也许,我不确定,以类似的方式,您也可以使用插件testResources 目标。

    【讨论】:

      【解决方案2】:

      如果您想在本地环境机器上使用脚本,您还可以添加目录 ma​​inFolder/scripts/postgres 作为依赖项。在 Intellij 中,您可以转到 Project Structure -> Modules -> your module -> dependencies -> + -> Jars or directory -> your script directory -> Classes。 然后就可以使用了

      @Sql("/yourScript.sql")
      

      在 DevOps 管道中,您需要将专用目录添加到应用服务器类路径。

      请记住,您必须为您的 sql 文件保留唯一的名称,因为如果您打算使用具有多个目录级别的结构,我认为 jvm 将仅加载第一个条目。这不是推荐的方法,但如果您只需要生成报告或在本地环境中测试某些内容,它会很快。

      另一种方法是在运行时指定 -Xbootclasspath/a:。然后,您将能够按照最初的需要将 @Sql 与相对路径一起使用。 例如

      -Xbootclasspath/a:path-to-mainFolder
      

      那么你就可以使用

      @Sql("/scripts/postgres/script.sql")
      

      【讨论】:

        猜你喜欢
        • 2021-11-07
        • 2011-05-05
        • 1970-01-01
        • 2013-01-22
        • 2015-10-20
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        相关资源
        最近更新 更多