【问题标题】:Executing java class in JAR from a java program从java程序执行JAR中的java类
【发布时间】:2012-02-28 13:40:57
【问题描述】:

我的问题是:

我有一个 test.java 类,它是主类。 JAR 文件中还有一个类(非主类)。现在我想从 JAR 外部的主类编译和执行 JAR 中的演示类。请解释原因。

public class test
{   
public static void main(String args[])
{
    demo d1 = new demo();
    demo d2 = new demo("message passed from main class");
}
} 

public class demo
{
demo()}
System.out.println("message in demo class");
}
demo(String str)
{
System.out.println(str);
}}

【问题讨论】:

  • “请解释一下。” 请解释一下为什么?
  • 简单说一下设计,你的class应该总是以大写字母开头,所以public class Test,public class Demo
  • 同意。我没有太在意,因为我想在这里发布示例代码。

标签: java jar mainclass


【解决方案1】:

看看这个:Packaging Programs in JAR Files

一旦您准备好主类和 JAR 文件,您只需在类路径上运行带有 JAR 文件的主类,Java 就会找到它。假设 demo 类在 demo.jar 中,而您的主类是 test (如您的示例所示):

java -cp demo.jar test

【讨论】:

  • 它在线程主线程中给出异常说异常。 java.lang.Noclassdeffounderror:TEST.
  • 在我的 demo.jar 我有 demo.class 和 demo.java。外面我有test.java。我通过“JAVAC TEST.JAVA -CLASSPATH DEMO.JAR”编译测试。它编译成功。现在我正在尝试通过“JAVA -CP DEMO.JAR TEST”执行测试,现在它给出了这个异常。
  • Java 区分大小写。如果您将类定义为test,则需要以test 而不是TEST 运行它。
【解决方案2】:

我猜我们的正确答案是“使用蚂蚁”,但是:

javac test.java
javac demo.java
jar cf test.jar test.class demo.class
jar ufe test.jar test

然后,

java -jar test.jar

如果您打算对此进行扩展,并且继续不使用 ant,您可能希望构建系统在出错时停止,并且会注意到“javac”在出错时不会返回非零值。将其标准错误传送到一个临时文件,然后根据 grep 对该文件的非零返回退出。例如,来自无法使用 ant 的设备上构建脚本:

cd src
for F in R.java Maze.java EmptyActivity.java; do
  javac -d ../build/classes $P/$F 2> ~/tmp/javac.out
  echo -en "\033[1m"; cat ~/tmp/javac.out; echo -en "\033[0m"
  grep error ~/tmp/javac.out && exit
done
cd ..

【讨论】:

    【解决方案3】:

    如果您想使用任何class in java,那么该类必须存在于class-path 因为当你运行你的程序时,所有需要的class总是在class path..
    所以你必须设置你的demo.jar的类路径
    没有办法设置类路径看看这个How set class path

    或者干脆你可以做另一个选项使用java参数-cp

    java -cp /your jar path/demo.jar test
    

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 2015-03-05
      • 2012-11-30
      • 2010-11-22
      • 2023-03-16
      • 2012-05-11
      • 1970-01-01
      相关资源
      最近更新 更多