I've written a Java program that uses OpenCV library. So far, I executed the program with eclipse (and set the Jar location in eclipse properties).
This is a college final project. My instructor now wants to run the program in his computer. How can I generate a runnable jar(using Ant or using Java code) that will load the Java OpenCV jar from specific location (a directory that will be located in the executable Jar directory), that will work with Linux and Windows (I understood that linux uses a Jar file, and Windows uses a dll file)?
I've tried using:
String currentDir = System.getProperty("user.dir");
System.load(currentDir + "/path_to_jar/opencv-248.jar");
(let's ignore the fact that it will only work with linux) But when executing the jar, the following error occurs:
OpenJDK 64-Bit Server VM warning: You have loaded library /path_to_jar/opencv-248.jar which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c ', or link it with '-z noexecstack'.
Exception in thread "main" java.lang.UnsatisfiedLinkError: /path_to_jar/opencv-248.jar: /path_to_jar/opencv-248.jar: invalid ELF header (Possible cause: endianness mismatch)
Any help would be highly appreciated.
Use the classpath option for your java executable.
If you're running OpenJDK read the manpage at http://linux.die.net/man/1/java-java-1.6.0-openjdk
You should be able to use something along the lines of:
java -jar yourapp.jar -cp ./path_to_jar/
Another option is to build a JAR which includes its own dependencies. Here are some examples I found using the search terms "java create jar include dependencies":
Using Maven
Using Eclipse
I've read a number of answers on classpaths, and i can't understand why this isn't working; Notice the directory listing beforehand that shows jdbc.jar is clearly in the Drivers directory, and then the java command still fails. Also, on my windows machine I can run this exact program with the same setup if i put a ; at the end of the -cp ( "./Drivers/*; ). java -version is java version "1.6.0_37".
[~/test ] $ ls -1 ./Drivers/
dbdump-0.1.0-SNAPSHOT-standalone.jar
jt400.jar
jtds.jar
[~/test ] $ java -cp "./Drivers/*" dbdump.core input.config
Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:jtds:sqlserver://SERVER;instance=MSSQLSERVER;database=dbone;
at java.sql.DriverManager.getConnection(DriverManager.java:602)
at java.sql.DriverManager.getConnection(DriverManager.java:154)
at clojure.java.jdbc$get_connection.invoke(jdbc.clj:219)
at dbdump.core$_main.invoke(core.clj:60)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.AFn.applyTo(AFn.java:151)
at dbdump.core.main(Unknown Source)
[~/test ] $
java handles path same whether be it on windows or linux.
So question is if ; is working on windows why it will not work on linux.
Secondly have you tried executing the same code or program on any other linux machine.
I am presuming may be the jar is corrupt. What about pin-pointedly mentioning the jar. not just * to pick up all jars
yep what nishant mentions is the correct usage of java call. along with loading the jar we also need to call the class
"lib/*" should be enough (reference):
java -cp "Drivers/*" com.example.Classname
Class path entries can contain the basename wildcard character *,
which is considered equivalent to specifying a list of all the files
in the directory with the extension .jar or .JAR. For example, the
class path entry foo/* specifies all JAR files in the directory named
foo.
For what it is worth, this is how things are handled on windows.
I want to execute my program without using an IDE.
I've created a jar file and an exectuable jar file. When
I double click the exe jar file, nothing happens, and when I try to use the command in cmd it gives me this:
Error: Unable to access jarfile <path>
I use the command: java -jar Calculator.jar
How I created the jar:
Right click on project folder (Calculator)
Select
Click on Java Folder and select "Exectuable Jar File", then select next
Launch Configuration: Main - Calculator
Create Export Destination
Hit "Finish" and profit! Well, not really.
I had encountered this issue when I had run my Jar file as
java -jar TestJar
instead of
java -jar TestJar.jar
Missing the extension .jar also causes this issue.
Fixed
I just placed it in a different folder and it worked.
[Possibly Windows only]
Beware of spaces in the path, even when your jar is in the current working directory. For example, for me this was failing:
java -jar myjar.jar
I was able to fix this by givng the full, quoted path to the jar:
java -jar "%~dp0\myjar.jar"
Credit goes to this answer for setting me on the right path....
I had this issue under CygWin in Windows. I have read elsewhere that Java does not understand the CygWin paths (/cygdrive/c/some/dir instead of C:\some\dir) - so I used a relative path instead: ../../some/dir/sbt-launch.jar.
I had the same issue when trying to launch the jar file. The path contained a space, so I had to place quotes around. Instead of:
java -jar C:\Path to File\myJar.jar
i had to write
java -jar "C:\Path to File\myJar.jar"
Just came across the same problem trying to make a bad USB...
I tried to run this command in admin cmd
java -jar c:\fw\ducky\duckencode.jar -I c:\fw\ducky\HelloWorld.txt -o c:\fw\ducky\inject.bin
But got this error:
Error: unable to access jarfile c:\fw\ducky\duckencode.jar
Solution
1st step
Right click the jarfile in question. Click properties.
Click the unblock tab in bottom right corner.
The file was blocked, because it was downloaded and not created on my PC.
2nd step
In the cmd I changed the directory to where the jar file is located.
cd C:\fw\ducky\
Then I typed dir and saw the file was named duckencode.jar.jar
So in cmd I changed the original command to reference the file with .jar.jar
java -jar c:\fw\ducky\duckencode.jar.jar -I c:\fw\ducky\HelloWorld.txt -o c:\fw\ducky\inject.bin
That command executed without error messages and the inject.bin I was trying to create was now located in the directory.
Hope this helps.
None of the provided answers worked for me on macOS 11 Big Sur. The problem turned out to be that programs require special permission to access the Desktop, Documents, and Downloads folders, and Java breaks both the exception for directly opened files and the permission request popup.
Fixes:
Move the .jar into a folder that isn’t (and isn’t under) Documents, Desktop, or Downloads.
Manually grant the permission. Go to System Preferences → Security and Privacy → Privacy → Files and Folders → java, and check the appropriate folders.
I had a similar problem and I even tried running my CMD with administrator rights, but it did not solve the problem.
The basic thing is to make sure to change the Directory in cmd to the current directory where your jar file is.
Do the following steps:
Copy jar file to Desktop.
Run CMD
Type command cd desktop
Then type java -jar filename.jar
This should work.
Edit: From JDK-11 onwards ( JEP 330: Launch Single-File Source-Code Programs )
Since Java 11, java command line tool has been able to run a single-file source-code directly. e.g.
java filename.java
If you are using OSX, downloaded files are tagged with a security flag that prevents unsigned applications from running.
to check this you can view extended attributes on the file
$ ls -l#
-rw-r--r--# 1 dave staff 17663235 13 Oct 11:08 server-0.28.2-java8.jar
com.apple.metadata:kMDItemWhereFroms 619
com.apple.quarantine 68
You can then clear the attributes with
xattr -c file.jar
It can also happen if you don't properly supply your list of parameters. Here's what I was doing:
java -jar test#gmail.com testing_subject file.txt test_send_emails.jar
Instead of the correct version:
java -jar test_send_emails.jar test#gmail.com testing_subject file.txt
This worked for me.
cd /path/to/the/jar/
java -jar ./Calculator.jar
For me it happens if you use native Polish chars in foldername that is in the PATH.
So maybe using untypical chars was the reason of the problem.
sometime it happens when you try to (run or create) a .jar file under /libs folder by right click it in android studio. you can select the dropdown in top of android stuio and change it to app. This will work
My particular issue was caused because I was working with directories that involved symbolic links (shortcuts). Consequently, trying java -jar ../../myJar.jar didn't work because I wasn't where I thought I was.
Disregarding relative file paths fixed it right up.
In my case the suggested file name to be used was jarFile*.jar in the command line. The file in the folder was jarFile-1.2.3.jar . So I renamed the file to jarFile. Then I used jarFile.jar instead of jarFile*.jar and then the problem got resolved
It can happen on a windows machine when you have spaces in the names of the folder. The solution would be to enter the path between " ".
For example:
java -jar c:\my folder\x.jar -->
java -jar "c:\my folder\x.jar"
To avoid any permission issues, try to run it as administrator. This worked for me on Win10.
I know this thread is years ago and issue was fixed too. But I hope this would helps someone else in future since I've encountered some similar issues while I tried to install Oracle WebLogic 12c and Oracle OFR in which its installer is in .jar format. For mine case, it was either didn't wrap the JDK directory in quotes or simply typo.
Run Command Prompt as administrator and execute the command in this format. Double check the sentence if there is typo.
"C:\Program Files\Java\jdk1.xxxxx\bin\java" -jar C:\Users\xxx\Downloads\xxx.jar
If it shows something like JRE 1.xxx is not a valid JDK Java Home, make sure the System variables for JAVA_HOME in Environment Variables is pointing to the correct JDK directory. JDK 1.8 or above is recommended (2018).
A useful thread here, you may refer it: Why its showing your JDK c:program files\java\jre7 is not a valid JDK while instaling weblogic server?
For me it happen because i run it with default java version (7) and not with compiled java version (8) used to create this jar.
So i used:
%Java8_64%\bin\java -jar myjar.jar
Instead of java 7 version:
java -jar myjar.jar
I had a similar problem where TextMate or something replaced the double quotes with the unicode double quotes.
Changing my SELENIUM_SERVER_JAR from the unicode double quotes to regular double quotes and that solved my problem.
this is because you are looking for the file in the wrong path
1. look for the path of the folder where you placed the file
2. change the directory cd in cmd use the right path
I use NetBeans and had the same issue. After I ran build and clean project my program was executable. The Java documentation says that the build/clean command is for rebuilding the project from scratch basically and removing any past compiles. I hope this helps. Also, I'd read the documentation. Oracle has NetBeans and Java learning trails. Very helpful. Good luck!
Maybe you have specified the wrong version of your jar.
I finally pasted my jar file into the same folder as my JDK so I didn't have to include the paths. I also had to open the command prompt as an admin.
Right click Command Prompt and "Run as administrator"
Navigate to the directory where you saved your jdk to
In the command prompt type: java.exe -jar <jar file name>.jar
Keep the file in same directory where you are extracting it. That worked for me.
This is permission issue, see if the directory is under your User.
That's why is working in another folder!
Rename the jar file and try
Explanation :
yes, I know there are many answers still I want to add one point here which I faced.
I built the jar and I moved it into the server where I deploy (This is the normal process)
here the file name which I moved already existed in the server, here the file will override obviously right. In this case, I faced this issue.
maybe at the time of overriding there can be a permission copy issue.
Hope this will help someone.
Have you tried to run it under administrator privoleges?
meaning, running the command in "Run As" and then select administrator with proper admin credentials
worked for me
I was trying this:
After giving the file read, write, execute priviledges:
chmod 777 java-repl.jar
alias jr="java -jar $HOME/Dev/java-repl/java-repl.jar"
Unable to access bla bla..., this was on Mac OS though
So I tried this:
alias jr="cd $HOME/Dev/java-repl/ && java -jar java-repl.jar"
This did not work "Unable to access jarfile"
"C:\Program Files\java\jdk-13+33-jre\bin\javaw.exe" -jar "C:\Program Files\Maxim Integrated Products\1-Wire Drivers x64\ OneWireViewer.jar"
This does work
"C:\Program Files\java\jdk-13+33-jre\bin\javaw.exe" -jar "C:\Program Files\Maxim Integrated Products\1-Wire Drivers x64\OneWireViewer.jar"
The difference is the single space in front of OneWireViewer.jar not withstanding that it is surrounded with quotes and even has other spaces.
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.