所以,这不是关于从 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(第二张截图)
非常感谢任何帮助/指点!!!
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/