我有一个使用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);
异常发生在最后一行 - 它加载一个类