springboot-javafx-support icon indicating copy to clipboard operation
springboot-javafx-support copied to clipboard

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

Open sangjiexun opened this issue 2 years ago • 2 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!

sangjiexun avatar Jun 10 '22 08:06 sangjiexun

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

tanyaofei avatar Oct 15 '22 04:10 tanyaofei

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

tanyaofei avatar Oct 15 '22 05:10 tanyaofei

#96 This branch is about to fix this problem.

tanyaofei avatar Oct 17 '22 02:10 tanyaofei

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);
        });
    }

darhao avatar Nov 26 '22 23:11 darhao

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

banmao999 avatar Jan 02 '23 06:01 banmao999

感谢您的来信,我会马上回复您 

sangjiexun avatar Jan 02 '23 06:01 sangjiexun