Java Optaplanner-创建jar文件时出现NullPointerException
我的程序在IDE(IntelliJ)中运行良好,但由于某些原因,当我尝试创建jar文件时,当我从终端运行程序时,会出现以下错误: 位于org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory的线程“main”java.lang.NullPointerException中出现异常(ScoreDirectorFactoryConfig.java:461) org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:331) org.optaplanner.core.config.solver.SolverConfig.buildSolver(SolverConfig.java:220) org.optaplanner.core.impl.solver.AbstractSolverFactory.buildSolver(AbstractSolverFactory.java:57) org.optaplanner.EmployeeRoster.main(EmployeeRoster.java:31) 这是我在EmployeeRoster中的第31行:Java Optaplanner-创建jar文件时出现NullPointerException,java,jar,nullpointerexception,optaplanner,Java,Jar,Nullpointerexception,Optaplanner,我的程序在IDE(IntelliJ)中运行良好,但由于某些原因,当我尝试创建jar文件时,当我从终端运行程序时,会出现以下错误: 位于org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory的线程“main”java.lang.NullPointerException中出现异常(ScoreDirectorFactoryConfig.java:461)
Solver solver = SolverFactory.createFromXmlResource(SOLVER_CONFIG_XML).buildSolver();
SOLVER_CONFIG_XML是一个字符串,包含我的XML SOLVER CONFIG的路径,
看起来像这样
org.optaplanner.solver.floster
org.optaplanner.domain.Assignment
org/optaplanner/solver/employeeShiftsScoreRules.drl
5.
0硬/中/软
7.
1000
对我来说,问题是如何运行jar(java-jar),以及如何构建jar。当我从6.4.0升级到optaplanner core/7.4.1时,出现了NullPointerException。当我还在使用6.4.0时,这个问题没有出现
例外情况:
java.lang.NullPointerException
位于org.kie.internal.io.ResourceFactory.newByteArrayResource(ResourceFactory.java:66)
位于org.drools.compiler.kie.builder.impl.AbstractKieModule.getResource(AbstractKieModule.java:299)
位于org.drools.compiler.kie.builder.impl.AbstractKieModule.addResourceToCompiler(AbstractKieModule.java:264)
位于org.drools.compiler.kie.builder.impl.AbstractKieModule.addResourceToCompiler(AbstractKieModule.java:259)
位于org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:243)
位于org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:74)
位于org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:250)
位于org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:218)
位于org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:176)
位于org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryConfig.java:503)
下面是一个临时解决方案我解决了NullPointerException问题,只是让应用程序运行
解压fatJar.jar-d解压jar/
第三步。修改kie.conf
“fatJar”任务将依赖项展平-jar中允许重复的文件名。这导致了四个解压缩jar/META-INF/kie.conf文件,其中只有一个被使用。无论使用哪个kie.conf文件,这都是我的最终kie.conf文件
org.kie.api.internal.assembler.KieAssemblers = +org.optaplanner.core.impl.solver.kie.KieSolverAssemblerService
org.kie.api.internal.assembler.KieAssemblers = org.kie.internal.services.KieAssemblersImpl
org.kie.api.internal.runtime.KieRuntimes = org.kie.internal.services.KieRuntimesImpl
org.kie.api.internal.weaver.KieWeavers = org.kie.internal.services.KieWeaversImpl
org.kie.api.internal.runtime.beliefs.KieBeliefs = org.kie.internal.services.KieBeliefsImpl
org.kie.api.io.KieResources = org.drools.core.io.impl.ResourceFactoryServiceImpl
org.kie.api.marshalling.KieMarshallers = org.drools.core.marshalling.impl.MarshallerProviderImpl
org.kie.api.concurrent.KieExecutors = org.drools.core.concurrent.ExecutorProviderImpl
org.kie.api.KieServices = org.drools.compiler.kie.builder.impl.KieServicesImpl
org.kie.internal.builder.KnowledgeBuilderFactoryService = org.drools.compiler.builder.impl.KnowledgeBuilderFactoryServiceImpl
第四步。雷贾尔
不管出于什么原因,指定MANIFEST.MF文件对我没有任何帮助,因此我忽略了它
jar cf rejard.jar.
第五步。打开罐子
java-cp rejard.jar path.to.class.with.main.method
对于我来说,问题必须解决我想要如何运行jar(java-jar),以及如何构建jar。当我从6.4.0升级到optaplanner core/7.4.1时,出现了NullPointerException。当我还在使用6.4.0时,这个问题没有出现
例外情况:
java.lang.NullPointerException
位于org.kie.internal.io.ResourceFactory.newByteArrayResource(ResourceFactory.java:66)
位于org.drools.compiler.kie.builder.impl.AbstractKieModule.getResource(AbstractKieModule.java:299)
位于org.drools.compiler.kie.builder.impl.AbstractKieModule.addResourceToCompiler(AbstractKieModule.java:264)
位于org.drools.compiler.kie.builder.impl.AbstractKieModule.addResourceToCompiler(AbstractKieModule.java:259)
位于org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:243)
位于org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:74)
位于org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:250)
位于org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:218)
位于org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:176)
位于org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryConfig.java:503)
下面是一个临时解决方案我解决了NullPointerException问题,只是让应用程序运行
解压fatJar.jar-d解压jar/
第三步。修改kie.conf
“fatJar”任务将依赖项展平-jar中允许重复的文件名。这导致了四个解压缩jar/META-INF/kie.conf文件,其中只有一个被使用。无论使用哪个kie.conf文件,这都是我的最终kie.conf文件
org.kie.api.internal.assembler.KieAssemblers = +org.optaplanner.core.impl.solver.kie.KieSolverAssemblerService
org.kie.api.internal.assembler.KieAssemblers = org.kie.internal.services.KieAssemblersImpl
org.kie.api.internal.runtime.KieRuntimes = org.kie.internal.services.KieRuntimesImpl
org.kie.api.internal.weaver.KieWeavers = org.kie.internal.services.KieWeaversImpl
org.kie.api.internal.runtime.beliefs.KieBeliefs = org.kie.internal.services.KieBeliefsImpl
org.kie.api.io.KieResources = org.drools.core.io.impl.ResourceFactoryServiceImpl
org.kie.api.marshalling.KieMarshallers = org.drools.core.marshalling.impl.MarshallerProviderImpl
org.kie.api.concurrent.KieExecutors = org.drools.core.concurrent.ExecutorProviderImpl
org.kie.api.KieServices = org.drools.compiler.kie.builder.impl.KieServicesImpl
org.kie.internal.builder.KnowledgeBuilderFactoryService = org.drools.compiler.builder.impl.KnowledgeBuilderFactoryServiceImpl
第四步。雷贾尔
无论如何
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ... -->
<build>
<plugins>
<!-- ... -->
<!-- fat jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptors>
<descriptor>src/assembly/distribution.xml</descriptor>
</descriptors>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.veryseriouscompany.veryseriousproject.app.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- ... -->
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>epigno-jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
<!-- Exclude all META-INF/kie.conf during unpacking -->
<unpackOptions>
<excludes>
<exclude>META-INF/kie.conf</exclude>
</excludes>
</unpackOptions>
</dependencySet>
</dependencySets>
<files>
<file>
<!-- Manually copy your custom kie configuration file from your repository. -->
<!-- Please replace this path by whatever path is relevant for your project. -->
<source>src/main/resources/META-INF/kie.conf</source>
<outputDirectory>META-INF</outputDirectory>
</file>
</files>
</assembly>
mvn package