Jetty启动项目中引用json-lib相关类库报错ClassNotFound的解决方案

  • Post category:http

这是一个比较常见的问题,即在使用Jetty启动项目时,引用了json-lib相关类库,但是在运行时却抛出了ClassNotFound的异常。这种情况通常是由于json-lib所依赖的类库没有正确的加载所致,这里提供以下两个可能的解决方案:

方案一:在jetty的启动命令中添加类库路径参数

在启动Jetty的过程中,可以通过添加-Djava.ext.dirs参数指定额外的类库路径。这样,Jetty在启动时就会将这些路径下的类加入类加载路径中,从而避免了ClassNotFound的异常。

例如,在启动Jetty时,需要添加json-lib和其依赖的类库的路径这样的参数:

java -Djava.ext.dirs=<json-lib所在的路径>:<依赖库1所在的路径>:<依赖库2所在的路径> -jar start.jar

其中,<json-lib所在的路径>是指json-lib所在的路径,<依赖库1所在的路径><依赖库2所在的路径>则是指json-lib所依赖的其他类库所在的路径。

方案二:将依赖的类库打包到应用程序的jar包中

如果上述方案不能解决问题,我们可以选择将依赖的类库打包到应用程序的jar包中。这样,当应用程序启动时,所有需要的类库都已经包含在应用的jar文件中了。

下面以Maven项目为例,具体步骤如下:

  1. 将需要打包进jar文件的所有类库添加到pom.xml文件的dependencies标签中:
<dependencies>
    <dependency>
        <groupId>net.sf</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
    </dependency>
    <!-- 其他依赖的类库 -->
</dependencies>
  1. 配置maven-assembly-plugin插件以将所有依赖的类库打包到可执行的jar文件中:
<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.example.MainApp</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
        </plugin>
    </plugins>
</build>
  1. 运行mvn package命令打包项目,并在target目录下找到可执行的jar文件。

以上两个解决方案可以有效避免在Jetty启动项目中引用json-lib相关类库导致ClassNotFound的问题。