比如我写了一个java文件,然后这个java文件有一个main函数,我可以在ide环境直接运行她,但是如果我把这个class copy到其他的机器上,然后写一个.bat 内容是"java" -cp..............
就执行不了了,因为load不到该类依赖的.jar文件。
然后我就想
在java文件里动态的把依赖的.jar文件放入classpath但是我不知道怎么放了。
难道用:
System.getProperties().setProperty("classpath","java.class.path"));
 
如果我用了
System.getProperties().setProperty("classpath","java.class.path"));
 是否该句的下句就立刻可以load到我上面设置的依赖包了?

ClassPath还是很乱的感觉啊?不知道在class执行的机制中ClassPath到底是怎么使用的。

解决方案 »

  1.   

    -_-java -cp .;C:/;D:/;E:/classpath/lib/common.jar;E:/classpath/lib/tools.jar Main
      

  2.   

    这个我知道啊。可是我也不想让用户自己输入这些。而且这些都是绝度路径。
    我就想写在java文件里面有什么办法可以呢?
      

  3.   

    把你那些需要的jar的路径加入到环境变量classpath或者path中,直接就可以解决问题。
      

  4.   

    应该和ClassLoader有点关系,具体也没研究过,但是知道JAR包的位置不同,运行时就会出错.好像楼主也知道这些,关注一下.
      

  5.   


    楼主为啥非要写在Java文件里?
      

  6.   

    哦,也就是想在class里动态向jvm里加载jar。你懂什么是classLoader吗?明白什么叫类加载机制吗?你认为动态加载有你想的这么简单吗?你的类是根据动态模块加载来设计的吗?
      

  7.   

    目前动态加载解决方法有两个不错的选择。动态语言和OSGi。有兴趣可以看看。
      

  8.   

    http://java.sun.com/docs/books/tutorial/ext/basics/load.html
      

  9.   

    如果在Java程序中引入了外部包,而又不想把其放入jre/lib/ext文件夹下,只是想放在与工程的代码一起的,如:
    Test.java在包com.biao.normal中
    project directory: JavaDemo
     
    JavaDemo/com/biao/normal/Test.java
    JavaDemo/pack.jar
    Test.java要用到pack.jar中的com/biao/pack/PackageDemo.java
     
    怎样写classpath和javac, java来运行Test.java?
    JavaDemo/runandcompile.bat:
    set classpath=.;./pack.jar #关键是这里
    javac com/biao/normal/Test.java
    java com/biao/normal/Test
     
    其中最关键的一点是set classpath=.;./pack.jar中的".;"是必不可少的
     
      

  10.   

    用-classpath就可以
    1. 确保你正确设置了java_home, path 和classpath
       java_home=c:\java\jdk....(这个不是必须,前提是path中java命令能找到就可以)
       path=%java_home%\bin;...
       classpath=.2. 用-classpath,可以使用相对或绝对路径,一般建设用相对路径,所需要jar都放在lib包中。
    run.bat
    lib/*.jarin run.bat
    java -classpath lib\yourjar.jar;lib\yourjar2.jar com.yourpackage.yourmainclass
      

  11.   

    路径中的.;就是指当前执行的这个class中所有的jar包吧?如果用了就不用一个一个写出这个class路径下的jar包了吧?
      

  12.   

    任何时候把你应用打包发布时候 classpath一定要用相对路径
    系统JRE的path和classpath设置在环境变量中,如果你想这个也省了
    就直接把JRE也打包在你的应用中。
      

  13.   

    楼主写个bat文件,把相应的参数自动添加进去就可以了。要明白一点,楼主说的那个运行Java程序的“命令”,它的参数,是你Java程序本身的运行环境。
    这就好比,一个上门服务的计算机安装工程师,他本身具有安装计算机的配件的能力,
    但是,如果要让他安装配件,就必须得给他相应的“环境”,也就是地点、配件和工具。
    我们实际的解决方案是配备一个“小秘书”(bat文件),
    让小秘书拿着配件和工具,领着工程师到正确的地点进行工作。我们知道,一台机器和一台机器,上面安装的软件,以及各个软件、文件的位置是不相同的。
    所以,楼主的bat文件,就不能写的太死板了。
    比如,无论什么路径都用常量方式的绝对路径。应该尝试 跟路径+相对路径  的方式来进行。
    12楼的兄弟,他的path变量代表的路径,就采用了我说的方法。
    当然,跟路径,楼主还应该先进行常规位置的查找,才比较合适,
    因为,每个机器,跟路径会有所不同。
      

  14.   

    SET CLASSPATH=.;config;resource;lib/derby.jar;lib/commons-lang-2.4.jar;lib/commons-logging-1.1.1.jar;[.......jar;]
    start javaw 【your main class name】
      

  15.   

    你知道什么叫java吗?知道什么叫URLClassLoader吗?你认为动态加载是你想想的那么复杂吗?要动态加载必须要更具动态模块来设计吗?
    import demo.Person;
    import java.io.File;
    import java.lang.reflect.Method;
    import java.net.URL;
    import java.net.URLClassLoader;/**
     * 这里演示动态加载一个jar的方法
     * 其中 demo.Person 类打包在 E:/Training/person.jar
     * 执行的时候只需要在Demo的当前路径执行 java Demo就可以自动装载person.jar
     */
    public class Demo {
    public static void main(String[] args) {
    try {
    // 包路径定义
    URL urls[] = new URL[ ]{ new File("E:/Training/person.jar").toURL() }; // 获取类装载器,然后用反射方式调用类加载器的addURL方法,把新的jar路径添加进去
    URLClassLoader urlLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
    Class sysclass = URLClassLoader.class; 
    Method method = sysclass.getDeclaredMethod("addURL", new Class[]{URL.class});
    method.setAccessible(true);
    method.invoke(urlLoader, urls);

    Person p = new Person("Kyle.Zhang", 33);
    System.out.println(p);
    } catch (Exception exp) {
    exp.printStackTrace();
    }
    }
    }package demo;public class Person {
    private int age;
    private String name; public Person() {
    }

    public Person(String name, int age) {
    this.age = age;
    this.name = name;
    }

    public int  getAge() {
    return this.age;
    }
    public void setAge(int age) {
    this.age = age;
    } public String getName() {
    return this.name;
    }
    public void setName(String name) {
    this.name = name;
    } public String toString() {
    return "Person{name: " + this.name + ", age: " + this.age + "}";
    }
    }我问了老师啊,你也学习一下吧。xixi
      

  16.   

    我怎么感觉还不如直接用 eclipse导出 runnable的JAR包要来的方便。