2

I'm using default generated jhipster application and I'm wondering how to make it 'hot reload' using spring-boot-devtools.

That's how I tried to start this application in 2 different ways: http://prntscr.com/a4dhmu or http://prntscr.com/a4di2c

spring-boot-devtools library is included in dev profile (just simple generated pom.xml) and my Application.class is default:

package com.testnewfeatures.app;

import com.testnewfeatures.app.config.Constants;
import com.testnewfeatures.app.config.JHipsterProperties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration;
import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.env.Environment;
import org.springframework.core.env.SimpleCommandLinePropertySource;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Collection;

@ComponentScan
@EnableAutoConfiguration(exclude = { MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class, HazelcastAutoConfiguration.class })
@EnableConfigurationProperties({ JHipsterProperties.class, LiquibaseProperties.class })
public class Application {

private static final Logger log = LoggerFactory.getLogger(Application.class);

@Inject
private Environment env;

/**
 * Initializes TestNewFeatures.
 * <p/>
 * Spring profiles can be configured with a program arguments --spring.profiles.active=your-active-profile
 * <p/>
 * <p>
 * You can find more information on how profiles work with JHipster on <a href="http://jhipster.github.io/profiles.html">http://jhipster.github.io/profiles.html</a>.
 * </p>
 */
@PostConstruct
public void initApplication() throws IOException {
    if (env.getActiveProfiles().length == 0) {
        log.warn("No Spring profile configured, running with default configuration");
    } else {
        log.info("Running with Spring profile(s) : {}", Arrays.toString(env.getActiveProfiles()));
        Collection<String> activeProfiles = Arrays.asList(env.getActiveProfiles());
        if (activeProfiles.contains(Constants.SPRING_PROFILE_DEVELOPMENT) && activeProfiles.contains(Constants.SPRING_PROFILE_PRODUCTION)) {
            log.error("You have misconfigured your application! " +
                "It should not run with both the 'dev' and 'prod' profiles at the same time.");
        }
        if (activeProfiles.contains(Constants.SPRING_PROFILE_PRODUCTION) && activeProfiles.contains(Constants.SPRING_PROFILE_FAST)) {
            log.error("You have misconfigured your application! " +
                "It should not run with both the 'prod' and 'fast' profiles at the same time.");
        }
        if (activeProfiles.contains(Constants.SPRING_PROFILE_DEVELOPMENT) && activeProfiles.contains(Constants.SPRING_PROFILE_CLOUD)) {
            log.error("You have misconfigured your application! " +
                "It should not run with both the 'dev' and 'cloud' profiles at the same time.");
        }
    }
}

/**
 * Main method, used to run the application.
 */
public static void main(String[] args) throws UnknownHostException {
    SpringApplication app = new SpringApplication(Application.class);
    SimpleCommandLinePropertySource source = new SimpleCommandLinePropertySource(args);
    addDefaultProfile(app, source);
    Environment env = app.run(args).getEnvironment();
    log.info("Access URLs:\n----------------------------------------------------------\n\t" +
            "Local: \t\thttp://127.0.0.1:{}\n\t" +
            "External: \thttp://{}:{}\n----------------------------------------------------------",
        env.getProperty("server.port"),
        InetAddress.getLocalHost().getHostAddress(),
        env.getProperty("server.port"));

}

/**
 * If no profile has been configured, set by default the "dev" profile.
 */
private static void addDefaultProfile(SpringApplication app, SimpleCommandLinePropertySource source) {
    if (!source.containsProperty("spring.profiles.active") &&
            !System.getenv().containsKey("SPRING_PROFILES_ACTIVE")) {

        app.setAdditionalProfiles(Constants.SPRING_PROFILE_DEVELOPMENT);
    }
}
}

I'm doing something wrong becaus 'Hot reload' doesn't appear when I change any class.

Thanks!

dimonn12
  • 23
  • 1
  • 5
  • Normally, there's nothing special to do, it works well with your setup. I suppose you're using JHipster 2.27.0. Have you tried similar setup with a simple springboot app? https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html – Gaël Marziou Feb 17 '16 at 20:54

1 Answers1

1

Also according to your screenshots you use IDEA which does not auto compile classes on save by default, have you tried trigerring a build manually or the tricks below?

Intellij IDEA Java classes not auto compiling on save

Community
  • 1
  • 1
Gaël Marziou
  • 16,028
  • 4
  • 38
  • 49
  • 1
    Thanks! Yeah, it seems because IDEA doesn't compile java code right after save. I checked checkbox "Make project automatically" but there were no changes. When I compile changed class by myself (by hotkey for example) application restarts. It doesn't seem to be 'hot reload' but still is better than nothing. I'll look deeper into what's going wrong. At least I understood the reason. – dimonn12 Feb 19 '16 at 07:27
  • 1
    Is it possible to do hot reload for the code run by mvn `./mvnw spring-boot:run`? I have run so and in another terminal I am compiling using `./mvnw compile`. Hot reload is not working. What am I missing? – pmverma Nov 21 '16 at 12:21