I want to either display a message in the console or a pop up, so in case a parameter is not specified, I want to know to which should I display
Something like:
if( !file.exists() ) {
if( fromCommandLine()){
System.out.println("File doesn't exists");
}else if ( fromDoubleClickOnJar() ) {
JOptionPane.showMessage(null, "File doesn't exists");
}
}
I'm not clear on the question but I'm going to interpret it as you want to differentiate between the following 2
java -jar fred.jar
and
java package.Main
Here is an outline line of the program
The call
MonitoredVmUtil.mainClass(vm, false)
will either return 'jar
' or the name of your main class egMain
.You have to use
$JAVA_HOME/lib/tools.jar
to compile and run.The straight forward answer is that you cannot tell how the JVM was launched.
But for the example use-case in your question, you don't really need to know how the JVM was launched. What you really need to know is whether the user will see a message written to the console. And the way to do that would be something like this:
The javadoc for Console, while not water tight, strongly hints that a Console object (if it exists) writes to a console and cannot be redirected.
Thanks @Stephen Denne for the
!GraphicsEnvironment.isHeadless()
tip.From http://java.itags.org/java-essentials/15972/
The
System.console()
trick seems to do the work.Here's an alternative: there's a method in the class
Class
getProtectionDomain() which may be used to know the source of the code the the location from there.The funny is, this method is available since 1.2
I knew I used this before, here's the original answer by erickson
Here's the proof of concept:
Here's a short ( 1m aprox ) video to see this code running ( and being written with cat :-o )
it's true that it is impossible to tell how the JVM was invoked. but... there's a way to side step this. you assumed that when the user double clicked on a JAR, then there's GUI running... ok. so let's extend this assumption. check.. from where the class was invoked, the directory. check that directory.. assuming it's a normal usage, when there's a *.jar file, then the user must've started the app from a jar.. but one flaw is that the user can also click on the main class file. hahahaha
You can try with: