服务加载程序在打包为 jar 时找不到任何实现



我有一个在Java 10上运行的JavaFx项目,它在IntelliJ中完美运行,对我来说,这意味着我错误地打包了多模块项目。我试图搜索修复程序,但没有找到任何修复程序。

问题

我"成功"创建了一个.jar,因为我没有从 maven 包中得到任何错误,但是当我右键单击它并运行时,我的程序崩溃了,因为它找不到服务,因此无法继续正常操作。

下面的代码在通过 IntelliJ 运行时将输出IMPLEMENTATIONS,但在通过我的.jar运行时NO IMPLEMENTATIONS

ServiceLoader<Db> loader = ServiceLoader.load(Db.class);
if(!loader.iterator().hasNext()){
log.error("NO IMPLEMENTATIONS");
}else {
for(Db db : loader){
log.error("IMPLEMENTATIONS");
}
}

顶部绒球.xml构建部分

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>10</source>
<target>10</target>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<compilerArgs>
<arg>--add-opens=java.base/java.lang=gson</arg>
<arg>--add-exports=javafx.graphics/com.sun.javafx.application=ALL-UNNAMED,program</arg>
<arg>--add-exports=javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED</arg>
<arg>--add-exports=javafx.controls/com.sun.javafx.scene.control.skin.resources=ALL-UNNAMED</arg>
<arg>--add-exports=javafx.base/com.sun.javafx.event=controlsfx</arg>
</compilerArgs>
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>6.1.1</version> <!-- Use newer version of ASM -->
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<argLine>-Dlog4j.debug</argLine>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>

db 模块 pom.xml 构建部分

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>10</source>
<target>10</target>
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>6.1.1</version> <!-- Use newer version of ASM -->
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>

主项目pom.xml构建部分

<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<mainClass>startup.App</mainClass>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>startup.App</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>program</finalName>
<appendAssemblyId>false</appendAssemblyId>
<attach>false</attach>
</configuration>
</plugin>
</plugins>
</build>

我真的不确定我做错了什么。谁能指出我正确的方向?

问题可能是 META-INF/services/中的条目丢失了 - 这需要程序集插件的处理程序,请参阅带有此答案的此问题。也许程序集插件太旧了?

你的代码是模块化的还是非模块化的?如果是,那么您还必须在模块信息.java文件中声明您的服务及其用法。如果你打包的罐子实际上包含所需的文件和声明,可以通过解包和预期它们来轻松检查。

最新更新