victor defe
victor defe

Reputation: 1

How to import jar properly in java?

I am trying to import a jar file. My file "Test.java" contains the line:

"import org.jfugue.*;"

When I run the command "javac -classpath .:jfugue-5.0.9.jar Test.java", I get the error "package org.jfugue does not exist". How do I fix this?

Note: I am using a Mac machine.

Upvotes: 0

Views: 1403

Answers (2)

Kaan
Kaan

Reputation: 5754

Starting point

You want to compile code using the contents of a jar file, specifically "jfugue-5.0.9.jar", and you have a "Test" class with an import statement, like this:

import org.jfugue.*;
public class Test {
}

If you compile that code, you get an error like this:

% javac -classpath .:jfugue-5.0.9.jar Test.java                             
Test.java:1: error: package org.jfugue does not exist
import org.jfugue.*;
^
1 error

What's going on?

You're doing the right steps, mostly, but the import statement isn't correct. Syntax-wise, it's fine, but it does not align with the contents of the jar file. The structure of the jar contents (which you can see by running: jar tf jfugue-5.0.9.jar) shows that there is a directory for "org/jfugue/", but there are no classes or interfaces there; it's just a directory.

Below is a view of the first 9 lines of jar contents, sorted. It shows several directories without file contents – "org/" and "org/jfugue/" – but "org/jfugue/devices/" for example has four files present.

% jar tf jfugue-5.0.9.jar | sort | head -9
META-INF/
META-INF/MANIFEST.MF
org/
org/jfugue/
org/jfugue/devices/
org/jfugue/devices/MidiParserReceiver.class
org/jfugue/devices/MusicReceiver.class
org/jfugue/devices/MusicTransmitterToParserListener.class
org/jfugue/devices/MusicTransmitterToSequence.class

So if you were to change the import statement to "org.jfugue.devices.*" – which would match those four files ("MusicReceiver", etc) – then compilation would work fine (no errors).

import org.jfugue.devices.*;
public class Test {
}

% javac -classpath .:jfugue-5.0.9.jar Test.java
%

Solution

Following JLS 7.5.1, you can import each specific class one by one, such as:

import org.jfugue.devices.MidiParserReceiver;
import org.jfugue.devices.MusicReceiver;
import org.jfugue.devices.MusicTransmitterToParserListener;
import org.jfugue.devices.MusicTransmitterToSequence;

Or following JLS 7.5.2, you can import all classes and interfaces matching a wildcard pattern (so long as there are actually classes or interfaces matching that pattern) such as:

import org.jfugue.devices.*;

It's not allowed to import a subpackage, so "import org.jfugue;" (without the .* wildcard) would not work (see Example 7.5.1-3 No Import of a Subpackage in JLS).

Upvotes: 0

Actually if you inspect the jar file "jfugue-5.0.9.jar", There're no any Class files in the package "org.jfugue.". Instead it contains some sub packages such as org.jfugue.devices., org.jfugue.integration., org.jfugue.parser. etc.

Try something like this,

import org.jfugue.devices.*;

public class Hello {

   public static void main (String[] args) {
      System.out.println("Hi");

   }

}

Upvotes: 0

Related Questions