【问题标题】:Maven: How to protect a Java 7 project from using jar artifacts that compile against Java 8? [duplicate]Maven:如何保护 Java 7 项目不使用针对 Java 8 编译的 jar 工件? [复制]
【发布时间】:2016-12-21 11:25:33
【问题描述】:

我有一个由客户使用 Java 7 运行时运行的项目。

我在针对 Java 8 编译的工件中添加了一个依赖项 - 使用 Java 8 功能,如 lambda 和流。

编译我的项目时,我没有收到任何错误提示。

但在运行时,我收到一堆错误,显然无法识别内容。

有没有办法保护我的项目不使用依赖于更高级别 Java 的工件?谢谢。

* 对于依赖于某些低级 Java API 的工件的一般问题,该 API 试图添加对另一个依赖于更高级别 Java 的工件的依赖。

* 我猜这是因为 Java 不是显式依赖定义的一部分,而是隐含的。问题是如何使其更加明确和受保护。

【问题讨论】:

  • 我认为没有通用的解决方案。我能想到的是将 POM 中的依赖定义修复为最后一个已知的工作版本。您是否将 POM 配置为使用 PC 上安装的真正 Java7 编译器来编译您的项目?

标签: java maven java-8 maven-3 java-7


【解决方案1】:

您可以将maven-enforcer-pluginextra-enforcer-rule 结合使用,如下所示:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4.1</version>
        <executions>
          <execution>
            <id>enforce-bytecode-version</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <enforceBytecodeVersion>
                  <maxJdkVersion>1.7</maxJdkVersion>
                  <excludes>
                    <exclude>org.mindrot:jbcrypt</exclude>
                  </excludes>
                </enforceBytecodeVersion>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>extra-enforcer-rules</artifactId>
            <version>1.0-beta-6</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

您可以更安全地使用另一个enforcer-rule,您可以使用它来强制使用正确的JDK

【讨论】:

  • 为什么要排除org.mindrot:jbcrypt
  • 举个例子……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2017-04-20
  • 2016-03-15
  • 2015-06-02
  • 2014-08-28
相关资源
最近更新 更多