已配置SQLite JDBC依赖的JAR在命令行无法运行问题排查
核心问题:依赖未被正确打包或路径不匹配
当前使用的maven-jar-plugin仅会打包项目自身的代码,依赖的第三方JAR(比如sqlite-jdbc、slf4j-api)并没有被包含在生成的JAR里。Manifest中的Class-Path只是声明了依赖的相对路径,但如果这些依赖JAR没有放在与生成JAR同级的目录(或指定路径)下,命令行运行时就会出现类找不到的错误。
关于slf4j的疑问
slf4j-api只是日志接口,必须搭配具体的日志实现(比如slf4j-simple、logback)才能正常工作,否则运行时会抛出NoClassDefFoundError或日志警告。另外它出现在Class-Path但不在pom.xml里,说明可能是NetBeans自动引入的,但Maven构建时不会自动处理这个依赖,导致打包后如果没有手动放置相关JAR,必然会出问题。
两种可行解决方案
方案一:构建可独立运行的胖JAR(推荐)
使用maven-shade-plugin将所有依赖打包到同一个JAR中,这样不需要额外的依赖文件,直接运行即可。修改pom.xml的<build>部分:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.myorg.myproj.myclass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn package后,target目录下会生成一个带-shaded后缀的JAR文件,直接用java -jar xxx-shaded.jar就能运行。
方案二:分离依赖并自动复制到指定目录
如果不想打包成胖JAR,可以用maven-dependency-plugin将依赖复制到JAR同级的lib目录,同时修改Manifest的Class-Path指向lib下的文件:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <!-- 指定依赖在lib目录下 --> <mainClass>com.myorg.myproj.myclass</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.1</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 复制到target/lib --> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn package后,把target目录下的JAR文件和lib文件夹一起放到任意目录,运行java -jar xxx.jar即可。
补充:修复slf4j依赖问题
建议直接在pom.xml中添加slf4j的依赖,避免依赖缺失:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <!-- 添加简单的日志实现,比如slf4j-simple --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.36</version> <scope>runtime</scope> </dependency>
内容的提问来源于stack exchange,提问作者BusterZo

