I typed D:\yuicompressor-2.42\build in Path and save it (Windows XP). But when I tried executing it the command line displayed: unable to access jarfile. The same message that appear when I type an incorrect directory.
I tried executing the file in this way:
D:\wamp\www\projects\alexchen\alexchen 0.1\scripts>java -jar yuicompressor-2.4.2.jar custom.js -o custom.min.js
according to this
I tried calling the file directly and it works:
D:\wamp\www\projects\alexchen\alexchen 0.1\scripts>java -jar D:\yuicompressor-2.4.2\build\yuicompressor-2.4.2.jar custom.js -o custom.min.js
Probably you've misread the docs:
It's simple to use, as shown in the following example. Replace /path/to with the actual path to the YUI Compressor, yuicompressor-2.4.2.jar with the actual version you are using, common.js with your input filename and common.min.js with the name you want the output file to be:
java -jar /path/to/yuicompressor-2.4.2.jar common.js -o common.min.js
This means that you should specify full path to your jar file, not to put it in the Path env variable.
In order to execute a JAR file with java -jar you'll need to specify the full path to the JAR file.
java -cp "<path to jar file dir>" -jar "<jarfilename>" args
Of course you can create an enviroment variable that contains the absolute path to your yuicompressor-x.y.z.jar and even include the filename! This then could act as a placeholder or text-expander-like-makro.
So if, for example, your variable was named "yuicompressor" you could call this one instead of always having to enter the full path over and over again.
java -jar %yuicompressor% myFile.js -o myFile.min.js --charset utf-8
Related
I store jar files in C:\Users\myuser\javatools\avro-tools
And added them to my PATH:
echo %PATH%
...;
C:\Users\myuser\javatools\avro-tools;
I can run them by specifying the full path:
java -jar C:\Users\myuser\javatools\avro-tools\avro-tools-1.8.1.jar
But cannot run them without the full path:
java -jar avro-tools-1.8.1.jar
Error: Unable to access jarfile avro-tools-1.8.1.jar
I need to run jar files without changing to the directory, nor specifying these full paths.
UPDATE: Added %*
I'd recommend creating a batch file and run that instead.
avro-tools-1.8.1.bat
#echo off
java -jar C:\Users\myuser\javatools\avro-tools\avro-tools-1.8.1.jar %*
Place .bat file somewhere in PATH, and run by simply typing:
avro-tools-1.8.1.bat -abc def
The %* in the .bat file gets replaced with any argument passed to the .bat file, so the -abc def arguments are passed to the avro-tools program in the args array to the main method.
If you have multiple versions of Java installed, you can then choose which one to use when running that .jar file, by also qualifying the java command.
avro-tools-1.8.1.bat
#echo off
"C:\Program Files\Java\jdk1.8.0_181\java.exe" -jar C:\Users\myuser\javatools\avro-tools\avro-tools-1.8.1.jar %*
Now that code will run with Java 8, even if Java 8 is not the default Java on your machine.
I'm trying to run a script from an Amazon Linux machine. The script invokes checkstyle like this (in a script called eval.sh):
CHECKSTYLE="java -jar /home/ec2-user/grader/ext/checkstyle-6.15-all.jar"
CHECKSTYLE_RULES="/home/ec2-user/grader/config/checks.xml"
CHECKSTYLE_OUT="quality.log"
"${CHECKSTYLE}" -c "${CHECKSTYLE_RULES}" -f xml -o "${CHECKSTYLE_OUT}" $(find "${_toCheck}" -name "*.java") 2>"quality.err"
When I run this, I get the following error in quality.err:
./grader/eval.sh: line 10: java -jar /home/ec2-user/grader/ext/checkstyle-6.15-all.jar: No such file or directory
I have tried to run the same command directly in the terminal and it is working. Both checkstyle-6.15-all.jar and checks.xml are where they should be.
What could cause this problem?
Change "${CHECKSTYLE}" to ${CHECKSTYLE} (without the quotes).
You are passing the entire value of the CHECKSTYLE variable as a single word (that's what the quotes do), so the shell is looking for a relative directory named java -jar, and is trying to find a file under that (nonexistent) directory with the path home/ec2-user/grader/ext/checkstyle-6.15-all.jar.
When you envoke "${CHECKSTYLE}" the shell thinks that is the command you are running. There is no such file name with the spaces and options have you have included there. If you envoke it simply as ${CHECKSTYLE} (drop the quotes) the shell will process it for whitespace as normal and split it into the appropriate pieces for creating the process.
In a former version of our application, we used the Eclipse launcher on Windows for startup. We hand the launcher an .ini file with java properties via the --launcher.ini property.
Now, we cannot use the launcher anymore and start the application from a .bat file using a java -jar <file> command. Therefore, the properties in the .ini file have to be added to this java command individually.
My idea is to have the .bat script read the properties from the .ini file and store them in a variable as list. The content of this variable is then used as part of the java command. How to do that in a robust way?
If you start it via a *.bat script I would first check if the file exists using:
if not exist myfile.ini (
# print some error
)
and if it exist I would iterate parse each line by:
FOR /F %i IN (myfile.ini) DO #echo %i
After that I would fill an array with the values and pass it to the java invocation.
I can run java in cygwin+windows using the following settings (the sw/jar directory has several jar files, and I pick the relevant one from the java command line):
CLASSPATH=.;C:\sw\java_6u35\lib\\*;C:\sw\jar\\*
java org.antlr.Tool Calc.g
But I am having the following problems when running in linux:
(1) I can't set a directory name in a classpath, the following line reports an error:
setenv CLASSPATH .:/sw/jdk1.6.0_35/lib/\*:/sw/jar/*
(2) when I run explictly with -jar option, I still get an error:
java -jar /sw/jar/antlr-3.4.jar org.antlr.Tool Calc.g
error(7): cannot find or open file: org.antlr.Tool
However, the class does exist. When I do jar tf /sw/jar/antlr-3.4.jar, I get:
...
org/antlr/Tool.class
So my question is: (a) how do I specify in unix that my jar-directory is xxx that contains several jar files, and (2) how do I pick the relevant jar from this dir at runtime?
To specify multiple jars in a directory, directly in the java command, use this
java -cp "/sw/jar/*" org.antlr.Tool Calc.g
This will include all the jars
If you want to set the classpath in Unix/Linux systems, use this
export CLASSPATH=/sw/jar/a.jar:/sw/jar/b.jar
in unix use this to set the classpath:
export CLASSPATH=myClassPath
about not finding your jar, you're using a leading slash (/), that means that you path is absolute (not relative to your home folder) is this what you want?
if you want the path to be relative to your folder try:
java -jar ~/mypathToMyJar
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.