我真的不知道你项目的结构,虽然我做了一个小例子代码给你看,看看。
考虑到我的项目位于C:\Mine\JAVA\J2SE\src\testingjar>
在这里面我的目录结构如下:
testingjar
|
----------------------------------
| | | |
classes src manifest.text test.jar(this .jar we be creating shortly)
| |
| (Almost same as classes folder, just .java files)
---------------
| |
actualtest test
| |
*.class *.class
我的类将成为 .jar 文件的一部分,如下所示:
package test;
import java.awt.*;
import javax.swing.*;
public class CustomPanel extends JPanel
{
public CustomPanel()
{
setOpaque(true);
setBackground(Color.DARK_GRAY);
JLabel label = new JLabel(
"I am a JLabel from Java Swing", JLabel.CENTER);
label.setOpaque(false);
label.setForeground(Color.WHITE);
add(label);
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(500, 300));
}
}
我用以下命令编译了这个类:
C:\Mine\JAVA\J2SE\src\testingjar>javac -d classes src\test\CustomPanel.java
现在为 JAR 文件创建清单文件,其内容如下:
Main-Class: test.CustomPanel
请记住冒号 (:) 和包名之间的空格,即 test,在 CustomPanel 之后,按 Enter 并保存文件。
现在为了创建一个名为的 JAR 文件test.jar
,我编写了以下命令:
C:\Mine\JAVA\J2SE\src\testingjar>cd classes
C:\Mine\JAVA\J2SE\src\testingjar\classes>jar -cfm ..\test.jar ..\manifest.txt test
现在将使用此 .jar 文件的类将如下所示:
package actualtest;
import test.CustomPanel;
import java.awt.*;
import javax.swing.*;
public class ActualImplementation
{
private void createAndDisplayGUI()
{
JFrame frame = new JFrame("Testing Jar Implementation");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CustomPanel panel = new CustomPanel();
frame.setContentPane(panel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new ActualImplementation().createAndDisplayGUI();
}
});
}
}
我通过编写这些命令来编译它:
C:\Mine\JAVA\J2SE\src\testingjar\classes>cd..
C:\Mine\JAVA\J2SE\src\testingjar>javac -classpath test.jar -d classes src\actualtest\ActualImplement
ation.java
现在运行我写了这些命令:
C:\Mine\JAVA\J2SE\src\testingjar>cd classes
C:\Mine\JAVA\J2SE\src\testingjar\classes>java actualtest.ActualImplementation
输出
一定要匹配这些步骤,可能是你遗漏了一些东西,因为它在我这边工作得很好。
最新编辑:如被问及,我反其道而行之,现在JFrame
在 .jar 文件中并JPanel
正在使用它。
将成为 .jar 文件一部分的类如下:
package test;
import java.awt.*;
import javax.swing.*;
public class CustomFrame extends JFrame
{
public CustomFrame(String title)
{
super(title);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
manifest.txt 文件的内容,将更改如下:
Main-Class: test.CustomFrame
将使用 .jar 文件中的 CustomFrame 类的类如下:
package actualtest;
import test.CustomFrame;
import java.awt.*;
import javax.swing.*;
// http://stackoverflow.com/a/11150286/1057230
public class CustomPanel extends JPanel
{
private CustomFrame frame;
public CustomPanel()
{
setOpaque(true);
setBackground(Color.DARK_GRAY);
JLabel label = new JLabel(
"I am a JLabel from Java Swing", JLabel.CENTER);
label.setOpaque(false);
label.setForeground(Color.WHITE);
add(label);
}
private void createAndDisplayGUI()
{
frame = new CustomFrame("Testing Jar Implementation");
frame.setContentPane(this);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(500, 300));
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new CustomPanel().createAndDisplayGUI();
}
});
}
}
编译顺序,和之前的差不多,如下:
C:\Mine\JAVA\J2SE\src\testingjar>javac -d classes src\test\CustomFrame.java
C:\Mine\JAVA\J2SE\src\testingjar>cd classes
C:\Mine\JAVA\J2SE\src\testingjar\classes>jar -cfm ..\test.jar ..\manifest.txt test
C:\Mine\JAVA\J2SE\src\testingjar\classes>cd..
C:\Mine\JAVA\J2SE\src\testingjar>javac -classpath test.jar -d classes src\actualtest\CustomPanel.jav
a
C:\Mine\JAVA\J2SE\src\testingjar>cd classes
C:\Mine\JAVA\J2SE\src\testingjar\classes>java actualtest.CustomPanel
仍然是相同的输出,我得到了。
最新编辑:
我刚刚发现,有时这个东西有效,而不是后来,当使用 JAR 文件时,你必须指定包含点运算符的类路径 .
,比如
C:\Mine\JAVA\J2SE\src\testingjar>java -classpath test.jar;.; actualtest.CustomPanel
这是当我将文件夹actualtest
package
放入内部时testingjar
,上面的命令适用于这种情况。