roskenet/springboot-javafx-support

<Error: No auto configuration classes found in META-INF/spring.factories>

Closed this issue · 6 comments

Hello dear developer
There's a question here, it's about startup.
(1) Works fine when I start in the IDE.

bug-02

*(2) When I start via JAR, it reports an error like below.
bug-01
Please let me know how to solve this problem.
By the way ,I am using JDK17, SpringBoot 2.7

Thanks!

I have the same problem. I am using JDK11 and SpringBoot 2.7

I found out that the exception cause by CompletableFuture.supplyAsync(() -> SpringApplication.run(this.getClass(), savedArgs) )... at AbstractJavaFxApplicationSupport#init()

after I give a specify Executor, problem solved

  /*
   * (non-Javadoc)
   *
   * @see javafx.application.Application#init()
   */
  @Override
  public void init() throws Exception {
    // Load in JavaFx Thread and reused by Completable Future, but should not be a big deal.
    CompletableFuture.supplyAsync(() ->
        SpringApplication.run(this.getClass(), savedArgs), Executors.newFixedThreadPool(2)
    ).whenComplete((ctx, throwable) -> {
      if (throwable != null) {
        LOGGER.error("Failed to load spring application context: ", throwable);
        Platform.runLater(() -> showErrorAlert(throwable));
      } else {
        Platform.runLater(() -> {
          loadIcons(ctx);
          launchApplicationView(ctx);
        });
      }
    }).thenAcceptBothAsync(splashIsShowing, (ctx, closeSplash) -> {
      Platform.runLater(closeSplash);
    });
  }

You can copy the AbstractJavaFxApplicationSupport.java file to src/main/java/de.felixroske.jfxsupport and rewrite the method, it will solved your problem;

@sangjiexun

#96 This branch is about to fix this problem.

I encountered a similar problem. I modified the source code, changed the thread context class loader to SpringBoot's class loader, and then solved the problem

    @Override
    public void init() throws Exception {
        // Load in JavaFx Thread and reused by Completable Future, but should no be a big deal.
        defaultIcons.addAll(loadDefaultIcons());
        CompletableFuture.supplyAsync(() -> {
                    Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); //fix
                    return SpringApplication.run(this.getClass(), savedArgs);
                }
        ).whenComplete((ctx, throwable) -> {
            if (throwable != null) {
                LOGGER.error("Failed to load spring application context: ", throwable);
                Platform.runLater(() -> showErrorAlert(throwable));
            } else {
                Platform.runLater(() -> {
                    loadIcons(ctx);
                    launchApplicationView(ctx);
                });
            }
        }).thenAcceptBothAsync(splashIsShowing, (ctx, closeSplash) -> {
            Platform.runLater(closeSplash);
        });
    }

I encountered a similar problem. I modified the source code, changed the thread context class loader to SpringBoot's class loader, and then solved the problem

    @Override
    public void init() throws Exception {
        // Load in JavaFx Thread and reused by Completable Future, but should no be a big deal.
        defaultIcons.addAll(loadDefaultIcons());
        CompletableFuture.supplyAsync(() -> {
                    Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); //fix
                    return SpringApplication.run(this.getClass(), savedArgs);
                }
        ).whenComplete((ctx, throwable) -> {
            if (throwable != null) {
                LOGGER.error("Failed to load spring application context: ", throwable);
                Platform.runLater(() -> showErrorAlert(throwable));
            } else {
                Platform.runLater(() -> {
                    loadIcons(ctx);
                    launchApplicationView(ctx);
                });
            }
        }).thenAcceptBothAsync(splashIsShowing, (ctx, closeSplash) -> {
            Platform.runLater(closeSplash);
        });
    }

It works!! Thank u so much!!!!
I use the springboot-javafx-support code in SpringBoot3 with JavaFX17, and it work in IDEA, but fail to run in Jar
and finally works after use your modified code
it has took me two days to fingure out...tired