类加载

时间:2018-04-29 07:00:16

标签: java spring spring-boot spring-web

我有一个使用maven-assembly-plugin构建的spring web项目,这样我就可以生成一个超级/胖的jar。我也使用弹簧网,因为我想使用HttpRequest& HttpResponse

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>

我想将这个Jar作为Tomcat之外的独立应用程序运行(事实上我正在运行另一个Spring-boot应用程序,该应用程序动态加载此应用程序,然后实例化该类)

然后我使用ClassLoader(尝试URLClassLoader以及Thread.currentThread().getContextClassLoader())加载此JAR,以便我可以运行某个类。

但是当我在jar中加载所有类时,我得到一个例外:

java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpEntityEnclosingRequestBase

为了解决这个问题,我添加了org.apache.httpcomponents.httpclient依赖项并再次运行以点击:

java.lang.ClassNotFoundException: okhttp3.Callback

然后我添加了okhttp并点击:

java.lang.ClassNotFoundException: org.synchronoss.cloud.nio.multipart.NioMultipartParserListener

当我添加spring-boot-starter-web时,我得到:

java.lang.ClassNotFoundException: com.atomikos.jms.AtomikosConnectionFactoryBean

我不确定我应该走多远这条路。但我的问题是:

1)胖子不应该以孤立的方式包装所需的所有依赖关系吗?

2)在没有像容器这样的tomcat的情况下运行基于spring-web的app的最佳方法是什么

更新:添加POM和其他详细信息:

```http://maven.apache.org/xsd/maven-4.0.0.xsd“&GT;

<modelVersion>4.0.0</modelVersion>
<groupId>io.company</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>hello-world</name>
<url>http://maven.apache.org</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>    

```

我正在加载使用上述描述符构建的JAR,如下所示:

 jarFile = new JarFile(file);
        Enumeration<JarEntry> e = jarFile.entries();
        URL[] urls = { new URL("jar:file:" + file+"!/") };
        cl = URLClassLoader.newInstance(urls);

        // Load all dependent classes from libraries etc. 
        while (e.hasMoreElements()) {
            JarEntry je = e.nextElement();
            if(je.isDirectory() || !je.getName().endsWith(".class")){
                continue;
            }
            String className = je.getName().substring(0,je.getName().length()-6);
            className = className.replace('/', '.');
            //System.out.println("JE="+je.getName()+" &ClassName="+className);
            cl.loadClass(className);

异常发生在最后一行 - 它加载一个类

0 个答案:

没有答案