【问题标题】:Maven Profile in different dependencies不同依赖项中的 Maven Profile
【发布时间】:2014-03-04 08:47:58
【问题描述】:

我有一个带有两个不同数据库配置文件的 Maven 模块。

    <profile>
        <id>db-localhost-oracle</id>
        <dependencies>
            <dependency>
                <groupId>ojdbc6</groupId>
                <artifactId>ojdbc6</artifactId>
            </dependency>
        </dependencies>
        <properties>
            <db.driver>oracle.jdbc.driver.OracleDriver</db.driver>
            <db.dialect>no.jbv.sergej.util.FixedOracle10gDialect</db.dialect>
            <db.url>jdbc:oracle:thin:@//localhost:1521/xe</db.url>
            <db.hbm2ddl>update</db.hbm2ddl>
        </properties>
    </profile>

    <profile>
        <id>db-localhost-mysql</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
        </dependencies>
        <properties>
            <db.driver>com.mysql.jdbc.Driver</db.driver>
            <db.dialect>org.hibernate.dialect.MySQL5Dialect</db.dialect>
            <db.url>jdbc:mysql://localhost/${mysql.schema}</db.url>
            <db.hbm2ddl>update</db.hbm2ddl>
        </properties>
    </profile>

当使用“db-localhost-mysql”运行 maven install 时,它在 lib 目录中包含“mysql-connector-java”jar 文件。现在我使用“db-localhost-oracle”进行全新安装,它在 lib 目录中包含“mysql-connector-java”和“ojdbc6”jar。

如果我使用一个配置文件构建,maven 会自动删除其他配置文件的 jar,我该如何做到这一点?

【问题讨论】:

    标签: java maven profiles


    【解决方案1】:

    您的问题与实际情况不符。您的个人资料定义对我来说听起来很合适:

    mvn clean install 将启用db-localhost-mysql(因为它被标记为默认激活)并且它将添加 mysql-connector-java。如果你运行mvn clean install -Pdb-localhost-mysql 也会发生同样的情况

    mvn clean install -Pdb-localhost-oracle添加 ojdbc6 驱动程序。不会启用 mysql 配置文件(因为只有在没有配置文件明确处于活动状态时才会触发它)。

    这并不意味着您当前的依赖层次结构还没有这些 jar 之一。它可能以传递依赖的形式出现。要隔离这种情况并了解需要修复哪个项目,请运行 mvn dependency:tree -Pdb-localhost-oracle 以在未启用 mysql 配置文件时查看您的依赖关系层次结构。

    【讨论】:

    • 我发现如果我从 db-localhost-mysql 中删除 activeByDefault ,它会按预期工作。即当我使用 db-localhost-oracle 构建时删除了 mysql-connector-java jar。
    • 是不是这样,如果任何配置文件被标记为 activeByDefault,即使我们选择任何其他配置文件,它仍然保持活动状态?
    • 没有。它仅在启用 no 配置文件时才处于活动状态此配置文件将自动对所有构建都有效,除非使用上述方法之一激活同一 POM 中的另一个配置文件。当在命令行或通过其激活配置激活 POM 中的配置文件时,默认情况下处于活动状态的所有配置文件都会自动停用。 请参阅the documentation
    • 是的,没错,配置文件已按预期激活。这没有任何问题,但问题是如果我将 activeByDefault 与配置文件一起使用,即使我使用其他配置文件来构建项目,该配置文件的依赖 jar 也将始终被下载。为什么会这样以及如何摆脱这个东西?我不想要额外的罐子。
    • 我只是将您的 pom sn-p 复制/粘贴到我的一个项目中,并且依赖项:列表不同。同样,您所描述的不是配置文件如何与 Maven 一起使用。请阅读我的原始答案。我最好的猜测是,这种依赖已经来自您项目中的另一个依赖,mvn dependency:tree(没有该配置文件)将帮助您跟踪它的来源。试试mvn dependency:tree -Pdb-localhost-oracle看看谁在拉mysql驱动。
    【解决方案2】:

    我假设您在目标目录 (${basedir}/lib) 之外的某个位置使用 maven-dependency-plugin 下载下载的依赖项。

    如果是这种情况,您需要在干净的定义中包含您的 lib 目录(请参阅 http://maven.apache.org/plugins/maven-clean-plugin/examples/delete_additional_files.html):

    <build>
      [...]
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <version>2.5</version>
        <configuration>
          <filesets>
            <fileset>
              <directory>lib</directory>
            </fileset>
          </filesets>
        </configuration>
      </plugin>
      [...]
    </build>
    

    但是:请考虑换一种方式:

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 2018-09-21
      • 2021-09-26
      • 2014-02-19
      • 1970-01-01
      相关资源
      最近更新 更多