java - 使用 maven 在 eclipse 中的控制台中运行 java

标签 java eclipse maven java-8 java-7

所以,这不是关于从 eclipse 中运行 java 代码,而是从 eclipse 中的 maven(在 eclipse 之外)执行 java 命令工作得很好)。

具体来说:

我们有一个从 Maven 中执行的 .cmd 文件,它的相关部分:

java -classpath (the classpath) com.bea.wls.ejbgen.EJBGen (and some other stuff)

当从命令行 (mvn clean install) 运行时,我们确实得到了这个输出:

EJBGen WebLogic Server 12.1.3.0.0  Wed May 21 18:53:34 PDT 2014 1604337

 Creating my\package\ejb\Local.java
 Creating my\package\ejb\WebserviceLocal.java
 Creating my\package\ejb\ServiceLocal.java
 Creating my\package\ejb\LocalHome.java
 Creating my\package\ejb\WebserviceLocalHome.java
 Creating my\package\ejb\ServiceLocalHome.java

一切顺利

然而,当从 eclipse 中执行时:

EJBGen isn't supported by JDK version higher than 1.7

现在,控制台/m2e 运行如何选择要使用的 java 二进制文件?

  • jdk/jre 8 和 jdk 7 都安装在我的系统上。
  • 我使用 jdk 8 作为 eclipse 的运行时(在 eclipse.ini 中)(它是 NEON ,如果我尝试使用 7,它不会运行)并且我的“已安装的 jre”设置为 (jdk) 7(先看屏幕截图如下)
  • JAVA_HOME 变量设置为 7(如果我运行 java -version 它输出 7)
  • 我多次重启了 eclipse
  • m2e运行配置的执行环境也设置为jdk7(第二张截图)

installed jre's

run configuration

非常感谢任何帮助/指点!!!

S.

编辑:

(实际上)exec-maven-plugin 插件的配置:

        <plugin>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <groupId>org.codehaus.mojo</groupId>
            <executions>
                <execution>
                    <id>runEJBGen</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <executable>runEJBGen.cmd</executable>
                <!-- optional -->
                <workingDirectory>${project.basedir}\src\main\java</workingDirectory>
            </configuration>
        </plugin>

我们使用这种机制(而不是 java 变体)是因为其他 - 项目特定 - 原因...

编辑2: pom.xml的编译器选项

<properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>

最佳答案

基本上你正在尝试运行 java -classpath ...来自另一个 Java 进程的命令,从而创建 a new native process .从这一点开始,无论您对 Maven、Eclipse 等的配置如何,都将被忽略,只有 PATH为调用进程设置的环境变量将决定将运行哪个 Java 版本,即第一个 java在您的 PATH 上找到的可执行文件将被使用。

您的流程如下所示:

|- root process
  |- Eclipse process (run on Java 8 as per Eclipse config)
    |- Maven process (run on Java 7 as per M2E run config)
      |- New native process which will execute your .cmd file
        |- New Java process running from first java executable found on PATH entries

这些进程中的每一个都继承了 PATH它的 parent ,并可以操纵它。 Eclipse 可能会在您的 PATH 上添加新条目包含 Java 8 可执行文件。例如,当我从我的 Eclipse 中运行 Maven 构建并打印 PATH变量以将其与 Eclipse 外部的相同构建进行比较,Eclipse 进程在开头有以下条目,这些条目在 Eclipse 外部不存在:

C:/Program Files/Java/jre1.8.0_121/bin/server
C:/Program Files/Java/jre1.8.0_121/bin
C:/Program Files/Java/jre1.8.0_121/lib/amd64

这意味着我的 Eclipse 进程将 Java 8 条目添加到我的 PATH .我找不到关于这些条目的任何相关文档,但很可能你的问题是一样的。您可以尝试使用类似 System.out.println(System.getenv("PATH")); 的方式回显 PATH 变量在执行您的 .cmd 文件以在 Eclipse 和外部 Eclipse 之间进行比较之前。

尝试确保您的脚本运行正确的 Java 版本。您有多种选择:

  • (编辑:)按照@Bamboomy 的建议,使用%JAVA_HOME%/bin/java在脚本中使用 JAVA_HOME 指向的 Java 可执行文件环境变量
  • 而不是运行 java它将在您的 PATH 上搜索可执行文件,使用完整路径代替,例如 C:/java7/bin/java.exe
  • 配置脚本以搜索 java在你的 PATH 上可执行, 测试版本并只运行与您期望的版本相匹配的 java 可执行文件(您可以在 Windows 上使用 where 命令)
  • 操纵调用进程PATH执行脚本之前的环境变量,以确保使用正确的 Java 版本
  • 以任何其他方式确保适当的 java可执行文件由您的脚本运行;)

注意:最终最好的方法是避免运行进程调用进程调用进程,它必然会导致此类错误。

关于java - 使用 maven 在 eclipse 中的控制台中运行 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47455815/

相关文章:

JAVA - 按降序对链表进行排序

java - Eclipse:构建项目时 CPU 使用率高

java - Jbehave 无法找到多个故事

javascript - 有没有办法(从远程位置)引用 gulpfile.js 和 package.json?

maven - 在 "provided"执行阶段排除 "test"范围依赖?

Maven Checkstyle configLocation 被忽略?

java - Spring Data neo4j - Id 生成策略

java - Java 中的变量列表

java - 对于大 n,java.lang.Math.pow(x, n) 的准确/精确度如何?

eclipse - 为什么eclipse无法为hbase导入软件包?