【问题标题】:How to force Play 2.1 to compile against other Java version如何强制 Play 2.1 针对其他 Java 版本进行编译
【发布时间】:2013-03-06 17:15:03
【问题描述】:

我使用 Java 1.7 开发了一个 Play 应用程序。现在我需要针对 1.6 版本对其进行编译,因为它将在仍然使用 1.6 的另一台主机上执行(我无法更改)

所以我将启动脚本 play 复制到 play-1.6 并以某种方式对其进行了更改,以便它使用 JDK 1.6 版(我已将其存储在我的电脑)

在任何目录中执行此修改后的脚本时,我都会得到所需的信息行

play! 2.1.0 (using Java 1.6.0_38 and Scala 2.10.0), http://www.playframework.org

当我在我的项目目录中执行相同的脚本时,我得到了这条线

play! 2.1.0 (using Java 1.7.0_09 and Scala 2.10.0), http://www.playframework.org

项目使用 1.7 版的这些信息存储在哪里,如何强制它针对 1.6 版进行编译?

更新 1

Maxime Calmels 建议执行 clean 以最终删除已编译的配置文件。不幸的是,这没有帮助。

更新 2

当我在播放控制台中输入 java-home 时,我收到了消息

[info] None

所以我创建了一个文件 build.sbt 并添加了内容

javaHome := Some(file("/usr/java/jdk1.6.0_38"))

当启动播放控制台并输入 java-home 现在我得到了这条线

[info] Some(/usr/java/jdk1.6.0_38)

但是玩仍然会针对 1.7 版进行编译,所以也没有运气。

更新 3

我让它工作了...... 但是只需将 Play 和我的项目复制到应该运行项目的主机并在那里编译它。这不是一个非常优雅的解决方案,我仍然想知道如何在我的机器上进行本地处理。

【问题讨论】:

  • 您是从命令行编译还是从 IDE 编译?如果是后者,请确保您的 IDE 配置为使用 1.6
  • 我正在从命令行编译。
  • 我想看看您是如何更改播放文件的,也许您可​​以在 github 或其他地方分享这些文件,以便我们了解您如何将其更改为使用 jdk 1.7。您确定不同的版本是当您在不同的目录或不同的 shell 终端中时它们可能具有不同的 JAVA_HOME 值吗?
  • 我更改脚本文件的方式正是您在回答中提到的方式。没有其他任何改变。

标签: java scala compilation playframework playframework-2.1


【解决方案1】:

无论您在哪里安装了 Play,您都应该能够更改“播放”脚本,方法是将其替换为:

if [ -z "$JAVA_HOME" ]; then
    JAVA="java"
else
    JAVA="$JAVA_HOME/bin/java"
fi

这个新行:

JAVA="/TheFullJavaPath/bin/java"

应该这样做。然后该脚本将使用该版本。我建议您将其命名为必须播放-java-1.X 或其他名称。

【讨论】:

  • 这实际上是我已经尝试过的方法之一。我将 Java 1.6 的路径硬编码到 play 脚本中,并将其命名为 play-1.6。没有帮助强硬...
【解决方案2】:

我认为java版本存储在编译文件中。
您是否尝试在开始 play-1.6 脚本之前清理您的项目?

【讨论】:

  • 你好!我刚刚尝试过,但不幸的是这并没有解决问题。
【解决方案3】:

因为我无法评论:

1) 在开始游戏之前,您是否尝试过在 shell 中设置 JAVE_HOME?不要更改播放脚本。如果它要求那里的环境,也可以在其他地方进行。在 bash 中,它看起来像

#> export JAVA_HOME="/your/jdk/path"; play

2) 您是否在游戏控制台中尝试过inspect *:javaHome?如果javaHome 已明确设置在项目中的某个位置,那应该会告诉你在哪里。对我来说是这样的:

[project] $ inspect javaOptions
[info] Task: scala.collection.Seq[java.lang.String]
[info] Description:
[info]  Options passed to a new JVM when forking.
[info] Provided by:
[info]  */*:javaOptions
[info] Defined at:
[info]  (sbt.Defaults) Defaults.scala:106
[info] Reverse dependencies:
[info]  *:runner
[info] Delegates:
[info]  *:javaOptions
[info]  {.}/*:javaOptions
[info]  */*:javaOptions
[info] Related:
[info]  */*:javaOptions

【讨论】:

    【解决方案4】:

    您是否可以创建一个用于编译的 Ant 脚本? (我必须承认我不熟悉 Play,所以我不知道是否可能)。

    这就是我所做的,然后在编译目标中:

    <target name="compile" depends="prepare" description="Compile Java sources">
      <!-- Compile Java classes as necessary -->
      <javac
        bootclasspath="/path/to/1.6/rt.jar"
        destdir="/path/to/dest" includeantruntime="false" debug="true"
        deprecation="false" optimize="true"
        source="6" target="6" encoding="utf-8">
        <src path="/path/to/source" />
        <classpath refid="compile.classpath" />
      </javac>
    </target>
    

    引导类路径是关键。它应该指向 Java 1.6 的安装,尤其是 rt.jar 文件的安装。

    我不知道我的回答是否应该包含更多关于 Ant 的背景信息。以防万一,Ant 是一个用于创建任务的 Java 库(非常通用)。

    蚂蚁:http://ant.apache.org/ Ant初学者教程:http://www.comscigate.com/ant/A_beginners_guide_to_Ant.htm

    【讨论】:

      【解决方案5】:

      我遇到了这个问题,我在当前终端会话中设置JAVA_HOME 环境变量来解决它。如指定@Grmpfhmbl

      如果您使用sudo update-alternatives --config java 或其他任何方式更改您的Java 版本,这并不重要。 play 命令总是使用JAVA_HOME 环境变量来编译你的项目的源代码。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 2019-02-20
        • 1970-01-01
        • 2020-12-22
        • 2018-03-05
        • 1970-01-01
        相关资源
        最近更新 更多