使用JCL(JarClassLoader)加载jar文件:清除manifest中的classpath

时间:2010-05-09 13:22:24

标签: java classloader

我正在尝试使用以下代码

使用JCL加载jar文件
FileInputStream fis = new FileInputStream(new File( "C:\\Users\\sunils\\glassfish-tests\\working\\test.jar") );
        JarClassLoader jc = new JarClassLoader(  );
        jc.add(fis);
        Class main = jc.loadClass( "highmark.test.Main" );
        String[] str={};

        main.getMethod("test").invoke(null);//.getDeclaredMethod("main",String[].class).invoke(null,str);
        fis.close();

但是当我尝试运行这个程序时,我得到了Exception as

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at Main.main(Main.java:21)
Caused by: java.lang.RuntimeException: Embedded startup not found, classpath is probably incomplete
    at org.glassfish.api.embedded.Server.<init>(Server.java:292)
    at org.glassfish.api.embedded.Server.<init>(Server.java:75)
    at org.glassfish.api.embedded.Server$Builder.build(Server.java:185)
    at org.glassfish.api.embedded.Server$Builder.build(Server.java:167)
    at highmark.test.Main.test(Main.java:33)
    ... 5 more

根据这个,它无法找到类,但是当我明确地运行jar文件时它运行正常。似乎JCL忽略了jar文件中的其他类,

jar文件中的

MANIFEST.MF文件显示:

Manifest-Version: 1.0
Class-Path: .
Main-Class: highmark.test.Main

它似乎忽略了Class-Path: .,这个jar文件在我明确地使用Java运行时运行正常,这只是一个测试,实际上这个jar文件是以InputStream来的,它不能存储在文件系统中,如何解决这个问题,是否有解决方法?

感谢您的帮助。

UNDATE: 这是一个jar Main类:

package highmark.test;
import org.glassfish.api.embedded.*;

import java.io.*;

import org.glassfish.api.deployment.*;

    import com.sun.enterprise.universal.io.FileUtils;
    public class Main {
        public static void main(String[] args) throws IOException, LifecycleException, ClassNotFoundException {
            test();     
        }
        public static void test() throws IOException, LifecycleException, ClassNotFoundException{

        Server.Builder builder = new Server.Builder("test");

        Server server = builder.build();
        server.createPort(8080);
        ContainerBuilder containerBuilder = server.createConfig(ContainerBuilder.Type.web); 
        server.addContainer(containerBuilder);
        server.start();


        File war=new File("C:\\Users\\sunils\\maventests\\simple-webapp\\target\\simple-webapp.war");//(File) inputStream.readObject();
        EmbeddedDeployer deployer = server.getDeployer();
        DeployCommandParameters params = new DeployCommandParameters();
        params.contextroot = "simple";
        deployer.deploy(war, params);
        }
    }

1 个答案:

答案 0 :(得分:1)

确保清单以换行符结尾,否则最后一行可能无法正确解析。此外,如果您的jar文件不需要外部资源,则可能不需要指定类路径条目。如果外部jar文件和目录中存在所需资源,则可能只需要指定类路径。以下是tutorials

的示例
  

我们希望将MyUtils.jar中的类加载到类路径中以便在MyJar.jar中使用。这两个JAR文件位于同一目录中。

我们首先创建一个名为Manifest.txt的文本文件,其中包含以下内容:

Class-Path: MyUtils.jar