命令行运行Java程序时fazecast/jSerialComm/SerialPort异常排查
解决方案
你的问题核心是Maven默认生成的Jar包只包含项目自身代码,不会打包依赖的第三方库,而IDE会自动把依赖库加入运行时Classpath,所以IDE内运行正常,单独Jar包运行时找不到jSerialComm的类。下面提供两种可行的解决方法:
方法一:构建包含所有依赖的Fat Jar(推荐)
使用maven-shade-plugin将项目代码和所有依赖库打包到同一个Jar文件中,这样可以直接通过java -jar命令运行,无需额外处理依赖。
修改你的pom.xml,在<build><plugins>中添加以下插件配置:
<!-- Maven Shade Plugin 用于构建Fat Jar --> <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>alk.okc.particlecountalarm.ParticleCountAlarm</mainClass> </transformer> </transformers> <!-- 可选:避免依赖冲突,保留jSerialComm的原生库 --> <filters> <filter> <artifact>com.fazecast:jSerialComm</artifact> <includes> <include>**/*</include> </includes> </filter> </filters> </configuration> </execution> </executions> </plugin>
配置完成后,执行mvn clean package,target目录下会生成两个Jar文件:
ParticleCountAlarm-1.0.jar:原轻量Jar(仅项目代码)ParticleCountAlarm-1.0-shaded.jar:包含所有依赖的Fat Jar,直接运行这个文件即可:
java -jar ParticleCountAlarm-1.0-shaded.jar
方法二:复制依赖库并指定Classpath运行
如果不想打包成Fat Jar,可以用maven-dependency-plugin自动复制所有依赖到指定目录,运行时手动指定Classpath。
在<build><plugins>中添加以下插件配置:
<!-- 复制依赖到target/lib目录 --> <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> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin>
执行mvn clean package后,target/lib目录会包含所有依赖库(包括jSerialComm)。然后用以下命令运行:
java -cp "ParticleCountAlarm-1.0.jar:lib/*" alk.okc.particlecountalarm.ParticleCountAlarm
注意:Linux/macOS下用:分隔Classpath,Windows下用;。
内容的提问来源于stack exchange,提问作者David Filler
相关产品推荐
相关产品推荐

