IllegalArgumentException при экспорте OptaPlanner в качестве jar - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь экспортировать пример ProjectJobScheduling от OptaPlanner как исполняемый файл jar, но получаю следующую ошибку:

Exception in thread "main" java.lang.IllegalArgumentException: The solverConfigResource (org/optaplanner/examples/projectjobscheduling/solver/projectJobSchedulingSolverConfig.xml) does not exist as a classpath resource in the classLoader (jdk.internal.loader.ClassLoaders$AppClassLoader@c387f44).
    at org.optaplanner.core.config.solver.SolverConfig.createFromXmlResource(SolverConfig.java:107)
    at org.optaplanner.core.config.solver.SolverConfig.createFromXmlResource(SolverConfig.java:85)
    at org.optaplanner.core.api.solver.SolverFactory.createFromXmlResource(SolverFactory.java:60)
    at org.optaplanner.examples.common.app.CommonApp.createSolverFactory(CommonApp.java:135)
    at org.optaplanner.examples.common.app.CommonApp.createSolutionBusiness(CommonApp.java:123)
    at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:114)
    at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:110)
    at org.optaplanner.examples.projectjobscheduling.app.ProjectJobSchedulingApp.main(ProjectJobSchedulingApp.java:36)

Я просмотрел все связанные вопросы в StackOverflow, но мне не удалось решить проблема. Это часть кода ProjectJobSchedulingApp:

    public static final String SOLVER_CONFIG
            = "org/optaplanner/examples/projectjobscheduling/solver/projectJobSchedulingSolverConfig.xml";

    public static final String DATA_DIR_NAME = "projectjobscheduling";

    public static void main(String[] args) {
        prepareSwingEnvironment();
        new ProjectJobSchedulingApp().init();
    }

    public ProjectJobSchedulingApp() {
        super("Project job scheduling",
                "Official competition name:" +
                        " multi-mode resource-constrained multi-project scheduling problem (MRCMPSP)\n\n" +
                        "Schedule all jobs in time and execution mode.\n\n" +
                        "Minimize project delays.",
                SOLVER_CONFIG, DATA_DIR_NAME,
                ProjectJobSchedulingPanel.LOGO_PATH);
    }

Как можно решить эту проблему? Возможно, я создаю файл JAR неправильным образом?

Редактировать: Джеффри, спасибо за совет, он решил проблему. Теперь возникла новая проблема, аналогичная this one. Предложенное там решение, а также решение, предложенное Юрло c, не работают. Это код моего pom. xml файла:

<?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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.optaplanner</groupId>
    <artifactId>optaplanner</artifactId>
    <version>7.29.0.Final</version>
  </parent>

  <artifactId>optaplanner-examples</artifactId>

  <name>OptaPlanner examples</name>
  <description>
    OptaPlanner solves planning problems.
    This lightweight, embeddable planning engine implements powerful and scalable algorithms
    to optimize business resource scheduling and planning.

    This module contains the examples which demonstrate how to use it in a normal Java application.
  </description>
  <url>https://www.optaplanner.org</url>

  <properties>
    <java.module.name>org.optaplanner.examples</java.module.name>
  </properties>

  <repositories>
    <!-- Included so the examples sources in the distribution zip build out-of-the-box with maven -->
    <repository>
      <id>jboss-public-repository-group</id>
      <name>JBoss Public Repository Group</name>
      <url>https://repository.jboss.org/nexus/content/groups/public/</url>
      <layout>default</layout>
      <releases>
        <enabled>true</enabled>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>daily</updatePolicy>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <configuration>
            <forkCount>0.5C</forkCount>
            <systemPropertyVariables>
              <java.awt.headless>true</java.awt.headless>
            </systemPropertyVariables>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <!-- WARNING: This configuration must be run with "mvn exec:java" not "mvn exec:exec". -->
          <!-- It is impossible to write a configuration that is compatible with both exec:java and exec:exec -->
          <configuration>
            <mainClass>org.optaplanner.examples.app.OptaPlannerExamplesApp</mainClass>
            <arguments>
              <argument>-Xms256m</argument>
              <!-- Most examples run (potentially slower) with max heap of 128 MB (so -Xmx128m), but 1 example's dataset requires 1.5 GB -->
              <argument>-Xmx1536m</argument>
              <argument>-server</argument>
            </arguments>
          </configuration>
        </plugin>
        <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <dependencies>
    <!-- Internal dependencies -->
    <dependency>
      <groupId>org.optaplanner</groupId>
      <artifactId>optaplanner-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.optaplanner</groupId>
      <artifactId>optaplanner-persistence-common</artifactId>
    </dependency>
    <dependency><!-- Most examples use the XStream integration -->
      <groupId>org.optaplanner</groupId>
      <artifactId>optaplanner-persistence-xstream</artifactId>
    </dependency>
    <dependency><!-- TODO add examples that use the JAXB integration -->
      <groupId>org.optaplanner</groupId>
      <artifactId>optaplanner-persistence-jaxb</artifactId>
    </dependency>
    <dependency><!-- TODO add examples that use the jackson integration -->
      <groupId>org.optaplanner</groupId>
      <artifactId>optaplanner-persistence-jackson</artifactId>
    </dependency>
    <dependency>
      <groupId>org.optaplanner</groupId>
      <artifactId>optaplanner-benchmark</artifactId>
    </dependency>
    <dependency>
      <groupId>org.optaplanner</groupId>
      <artifactId>optaplanner-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.kie</groupId>
      <artifactId>kie-api</artifactId>
    </dependency>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-decisiontables</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-canonical-model</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-model-compiler</artifactId>
      <scope>runtime</scope>
    </dependency>
    <!-- External dependencies -->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
    </dependency>
    <dependency>
      <groupId>org.jfree</groupId>
      <artifactId>jfreechart</artifactId>
    </dependency>
    <!-- Common utils -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
    </dependency>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
    </dependency>
    <!-- Logging -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <scope>runtime</scope>
    </dependency>
    <!-- XML -->
    <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
    </dependency>

    <!-- Examples only dependencies. -->
    <!--
      WARNING: every examples only dependency must be properly dealt with in
      optaplanner-distribution/src/main/assembly/assembly-optaplanner.xml
    -->
    <!-- Converters -->
    <dependency>
      <groupId>org.jdom</groupId>
      <artifactId>jdom</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <exclusions>
        <exclusion>
          <!-- Collides with 'javax.xml.stream:stax-api' brought in by 'org.drools:drools-decisiontables'. -->
          <groupId>stax</groupId>
          <artifactId>stax-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.json</artifactId>
    </dependency>
  </dependencies>

</project>

1 Ответ

1 голос
/ 12 февраля 2020

Вы, вероятно, ошибаетесь в том, как строите исполняемый файл JAR. Пожалуйста, поделитесь соответствующим кодом (вероятно, pom.xml или assembly.xml) или попробуйте добавить его к вашему optaplanner-examples/pom.xml:


  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>org.optaplanner.examples.projectjobscheduling.app.ProjectJobSchedulingApp</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...