This is related to an earlier question by a different user, asking How to detect that code is running inside eclipse IDE.
I noticed that Eclipse always launches programs with javaw
rather than java
. (This does not imply a program launched with javaw
was launched from Eclipse).
I can find the arguments passed using
RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean();
List<String> lst = RuntimemxBean.getInputArguments();
for (int i = 0; i < lst.size(); i++)
System.out.println(lst.get(i));
But this does not tell me whether it was launched using java
or javaw
.
- Is there any way to find it out whether it was launched using
java
orjavaw
? - Why does Eclipse use
javaw
to launch programs?
System.console() will return null
, since the only difference between using java
and javaw
is that for javaw
, there is no associated console window.
Here's a small test program you can use to demonstrate that:
import javax.swing.JOptionPane;
public class ConsoleTest {
public static void main(String[] args) {
if (System.console() == null) {
JOptionPane.showMessageDialog(null, "System.console() is null");
} else {
JOptionPane.showMessageDialog(null, "System.console() is not null");
}
}
}
However, when running from within Eclipse, System.console()
will still return null
, even when started with java
.
In Eclipse's launch configuration, JRE tab, if you change the Runtime JRE to Alternate JRE, you can then change the Java executable from javaw
to java
.
Checking for System.console() didn't work for me, because of:
- It requires JDK 6 or later
- Console object is also missing, if application was run through the Runtime.exec(String) method. This was critical for me, because we using a lot of automated script.
So I'm using following solution:
private static boolean isJavaw() {
try {
System.in.available();
return false;
} catch (IOException e) {
// invalid handle in case of javaw
return true;
}
}
Works fine with JDKs 5, 6 and 7.
Is there any way to find it out whether it was launched using java or javaw?
According to the documentation: The javaw command is identical to java, except that with javaw there is no associated console window. Use javaw when you don't want a command prompt window to appear. The javaw launcher will, however, display a dialog box with error information if a launch fails for some reason.
Why does eclipse use javaw to launch programs?
To change from javaw to java:
- Open your launch configuration by choosing 'Run'->'Run...' from the menu bar.
- Select your application's launch configuration.
- Switch to the 'JRE' page.
- Deselect 'Use default Java executable'
- Type in 'java' in place of 'javaw'.
I think because eclipse developers develops GUI applications and they don't need console window.
来源:https://stackoverflow.com/questions/2469047/can-i-find-out-if-the-java-program-was-launched-using-java-or-javaw