Shell script: How to put absolute path into command? - java

I was trying to execute my java program through shell script so I wrote:
java -jar $(pwd)"/test.jar"
It worked flawlessly but when I turned to the code below:
PATH=$(pwd)"/test.jar"'
java -jar $PATH
Then I got an error: "Run.sh: 3: java: not found"
(Running on Ubuntu)
I have very little experience in shell script so please let me know what's wrong with it. Thanks.

PATH is a special environment variable which the shell uses to find executables. You've changed PATH to point at test.jar, so now the shell can't find java.
Call your variable something else.
Example:
LIB_PATH="$(pwd)/test.jar"
java -jar ${LIB_PATH}

The value in $(PWD) depends on the directory the script is called from (print working directory). If you call the script from another directory, than the one your jar-files resides in, you'll get the wrong path. And you changed the search path of the SHELL, that will prevent the shell from finding any other binary e.g. java.

PATH is system-reserved variable, that define the way where your system should look to find the executable (in your case java). Therefore you shouldn't use it in your code as variable to your test.jar .
In my opinion, your code should be something like:
#!/bin/sh
PROGPATH='/path/to/your/test.jar'
JAVAEXEC=`which java`
JAVAPARAMS='-j'
GLOBALPATH="$JAVAEXEC $JAVAPARAMS $PROGPATH"
echo $GLOBALPATH

Related

Where to put files for a command-line Java program?

I have written a Java program that takes in arguments and then executes. I pass in these arguments from the command line (I am on a Macbook Pro using Terminal, using the bash shell). Let's say the name of my program is prgm. I want to be able to say "prgm " from any directory in the shell and then have that program execute. So I figure I need to write a bash script to reference the Java files and take in arguments, and put that bash script somewhere in my PATH. Where do I put the bash file, and where do I put my Java files? Also, am I right to assume that I only need the .class (binary) Java files?
Step-by-step:
Assuming that the name of the Java executable if myjavaprog.
Assuming that the name of your bash script is myscript.
Make sure myscript is calling myjavaprog using absolute path and the desired arguments.
call echo $PATH and you will see a bunch of paths: /some/path1:/some/other/path2:...
Put your bash script in whatever path you want from the ones returned by echo $PATH.
Go to a random path.
Call you bash script bash myscript. See the execution of myjavaprog.
Tips:
If java program is for personal use only, put it in a path starting with /usr/ or even in your $HOME directory (and add that location to your PATH)
If java program must be shared with other users, put it in an accessible place, so that other users don't need to modify their PATH variable.

OSX How do I have a Shell script change directory to the one the script is in?

I'm using Apple's automator to create a Shell Script. I can get it to run if I change directory specifically to where the jar file is. But what if I want to change to directory to wherever the Shell script happens to be running?
Right now I have the following, which works:
cd desktop/CommonDenom/
java -XstartOnFirstThread -jar CommonDenom.jar
I know there's a way to target whatever directory the Shell script is launched from, but I can't seem to get anything to work. Please be specific with instructions as I havent been using Automator very long. Unless someone can specify how ot writ ethe script without Automator. Thanks in advance.
A standard idiom for this in shell scripts is dirname $0. The $0 variable is the path to the script that was executed, and the dirname command takes a path and strips off the last component to leave the path to the containing directory
cd "`dirname $0`"
Just wanted to weigh in here. I've seen some people with this problem. If you are JUST on OSX and making your own scripts. This will do the trick :) kind of a hack, but works like a charm.
#! /bin/bash
sudo /Applications/XAMPP/xamppfiles/xampp startapache
open /Applications/XAMPP/htdocs
#!/bin/bash
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
cd "${DIR}"
...the rest of your script...
Credits to Ian C. on AskDifferent: https://apple.stackexchange.com/a/179064
I am not sure you mean "you want to change directory to wherever the script is run from" because you will be in the directory the script is run from when you start anyway, so there will be no need to change directory there. I think you mean you want the script to stay wherever it starts, yet still be able to find the jar file.
In which case, you probably jus need the following without any changing directory:
java -XstartOnFirstThread -jar ~/Desktop/CommonDemon/CommonDemon.jar

Setting java home

I'm trying to use the command "ant build".The message says java home is not defined correctly we cannot execute /usr/bin/java//bin/java <notice the 2 slashes>
If i use the command echo $JAVA_HOME it returns usr/bin/java . What needs changing here?
The $JAVA_HOME variable does not refer to the java executable, but to the parent directory of the bin/java executable itself. This is the reason Ant complains of not being able to execute some cryptic /usr/bin/java//bin/java.
For example, in my case (Ubuntu 12.04, OpenJDK) the java home is set to
/usr/lib/jvm/java-6-openjdk-amd64/jre
where obviously there exists a /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java, of which /usr/bin/java ultimately represents a symbolic link.
Looks like Ant is assuming /usr/bin/java to start. Perhaps you don't need to set it.
Or try adding a leading slash (/usr instead of usr).
JAVA_HOME shouldn't be pointed to the java executable, rather it should be the parent directory of 'bin' where javac the compiler is located.
Usually the '/usr/bin/java' is a symbolic link to the actual executable in somewhere else, e.g., '/usr/lib/java/jdk*/bin/java', in which case the java home should be /usr/lib/java/jdk*.

Do commands run from current directory in a shell script?

In a bash shell script I tried these two versions:
java -jar abc.jar&
and
CMD="java -jar abc.jar&"
$CMD
The first verison works, and the second version complains that abc.jar cannot be found. Why?
Commands do run from current directory in a shell script.
This is why the first command in your test script worked.
The second command may not work because either java isn't in your ${PATH} or abc.jar isn't in your ${CLASSPATH}. You could echo these environment variables or set +x to debug your bash script.
Bash (and others) won't let you do backgrounding (&) within the value of a variable (nor will they let you do redirection that way or pipelines). You should avoid putting commands into variables. See BashFAQ/050 for some additional information.
What is the actual error message you're getting? I bet it's something like "abc.jar& not found" (note the ampersand) because the ampersand is seen as a character in the filename.
Also, the current directory for the script is the directory that it is run from - not the directory in which it resides. You should be explicit about the directory that you want to have your file in.
java -jar /path/to/abc.jar&

Can an executable .jar file be called without having to use its full path?

I have a .jar file that I would like to be able to call without having to use a full file path to its location.
For example, if the .jar file is located at: /some/path/to/thearchive.jar
I'd like to be able to run it with:
java -jar thearchive.jar
instead of:
java -jar /some/path/to/thearchive.jar
when I'm elsewhere in the directory tree. In my specific case, I'm running a Mac with OS X 10.5.7 installed. Java version "1.5.0_16". I tried adding "/some/path/to" to PATH, JAVA_HOME and CLASSPATH, but that didn't work.
So, how do I setup to run a .jar from the command line without having to use its full path?
UPDATE: Another item to deal with would be arguments. For example:
java -jar /some/path/to/thearchive.jar arg1 arg2
This can have an effect on the way the question is dealt with as mentioned in the answers below.
You can add a variable to hold the directory:
export JARDIR=/some/path/to
java -jar $JARDIR/thearchive.jar
I'm not sure you can do it from environment variables implicitly.
No you can't.
Running a jar with -jar does not involve any kind of classpath mechanism since the jar file is the classpath.
Alternatively use a shell alias to launch the jar or a small script file.
According to Sun:
java -jar app.jar
To run the application from jar file that is in other directory, we need to specify the path of that directory as below: java -jar path/app.jar
where path is the directory path at which this app.jar resides.
So either out the path in a "standard" environment variable or define a wrapper which would be in your PATH
I don't believe so. If you have the jar specified in your CLASSPATH you could just call java with the main class specified. (i.e java com.test.Main) Alternatively you could create an alias in you shell to execute the command
alias execJar="java -jar /some/path/to/thearchive.jar"
Or another alternative is to create a wrapper script to execute it.
The Java system itself does not give you a way to specify something like JAR_PATH (a list of places to look for jar files). The other answers given use the MAC/Unix shell capabilities:
Setting an environment variable
Setting an alias
Possibly using a symbolic link (to the file or to the directory).
What might be helpful is to find out why specifying the entire path is a problem. That may guide us as to which answer is best or possibly find a completely different solution to your problem.
To run a .jar file without typing the full path you can put it in your classpath and run it by typing:
java fullclassname arg1 arg2
Mac OSX Developer Library recommends 'additional jar files that need to be placed on the system classpath be placed in the /Library/Java/Extensions folder. You can also put them in your own Library/Java/Extensions folder, but you will probably have to create the Java and Extensions folders.
If you do not know the full name of the main class in your .jar file, you can expand it and look in the MANIFEST.MF file in the META-INF folder. The Main-Class: line will tell you.
So, for example, to run the saxon9he.jar put it in /Library/Java/Extensions and you can type (from whichever folder you want)
java net.sf.saxon.Transform arg1 arg2...
Almost as short as typing java -jar jarfile.jar arg1 arg2, and you don't need to change any environment variables.
In short, if the jar is in your classpath, use the classname and you don't need the pathname.
Since there is no extra command line option for the location of jars or an environment variable is taken into account I am also not aware of an easy solution but would be highly interested in it as well.
A different approach could be to use a zsh wrapper script to get such a behaviour:
~/.scripts/java # .scripts at a prior position in your $PATH variable than java itself
#!/usr/bin/env zsh
# get -jar option and remove from $# (-D option)
zparseopts -D jar:=jarname
if [ -e $JAR_PATH/$jarname[2] ];
then
java -jar $JAR_PATH/$jarname[2] $#
elif [ -e $jarname[2] ];
then
java -jar $jarname[2] $#
else
java $#
fi
An advantage of zparseopts is that it can strip off the -jar option but all other options are retained within $#.
A further improvement would be to extend bash-completion or zsh-completion for the java command option -jar. For instance bash-completion of java -jar restricts file listings to *.jar files. For convenient usage someone could extend this by not only looking into current path but into $JAR_PATH. As a starting point see following unix.sx question.
But this solution doesn't look too good either.

Categories