我有一个在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");
}
}
top pom.xml build section
<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>
我真的不确定我做错了什么。有人能指出我正确的方向吗?
答案 0 :(得分:0)
问题可能是 META-INF/services/ 中的条目丢失 - 这需要程序集插件的处理程序,请参阅 this question 和 this answer。也许程序集插件太旧了?
答案 1 :(得分:0)
您的代码是否模块化?如果是,那么您还必须在 module-info.java 文件中声明您的服务及其用法。如果您打包的 jar 文件实际上包含所需的文件和声明,则可以通过解包并等待它们来轻松检查。