Java >> Java tutorial >  >> Tag >> maven

Oprettelse af profilspecifikke konfigurationsfiler med Maven

Når vi skriver software, der er implementeret i forskellige miljøer, er vi ofte nødt til at oprette forskellige konfigurationsfiler for hvert miljø. Hvis vi bruger Maven, kan vi gøre dette ved at bruge byggeprofiler.

Dette blogindlæg beskriver, hvordan vi kan skabe et build-script, der bruger forskellige konfigurationer til udviklings-, test- og produktionsmiljøer.

Kravene til vores byggeproces er:

  • Hver profil skal have sin egen konfigurationsfil. Navnet på den konfigurationsfil er altid config.properties .
  • Konfigurationsfilerne skal findes fra profilerne/[profilnavn] bibliotek.
  • Udviklingsprofilen skal være aktiv som standard.

Lad os starte med at tage et hurtigt kig på vores eksempelapplikation.

Eksempelapplikationen

Eksempelapplikationen af ​​dette blogindlæg har kun én klasse, der skriver 'Hello World!' til en logfil ved at bruge Log4j. Kildekoden til HelloWorldApp klasse ser ud som følger:

import org.apache.log4j.Logger;

public class HelloWorldApp
{
    private static Logger LOGGER = Logger.getLogger(HelloWorldApp.class);

    public static void main( String[] args )
    {
        LOGGER.info("Hello World!");
    }
}

Egenskabsfilen, der konfigurerer Apache Log4j, hedder log4j.properties , og den findes fra src/main/resources-mappen . Vores log4j.properties fil ser ud som følger:

log4j.rootLogger=DEBUG, R

log4j.appender.R=org.apache.log4j.FileAppender
log4j.appender.R.File=${log.filename}
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

Vores Log4j-konfigurationsfil ser ret almindelig ud, men den har én ting, der ikke rigtig giver nogen mening. Værdien af ​​log4j.appender.R.File egenskaben er ${log.filename} .

Vores mål er at skabe et build-script, der erstatter denne pladsholder med den faktiske logfilsti. Men før vi kan oprette det byggescript, skal vi oprette de profilspecifikke konfigurationsfiler. Lad os komme videre og finde ud af, hvordan vi kan gøre det.

Oprettelse af de profilspecifikke konfigurationsfiler

Fordi vi skal oprette et build-script, der bruger forskellige konfigurationer i udviklings-, produktions- og testmiljøer, skal vi oprette tre konfigurationsfiler, der er beskrevet i det følgende:

  • profilerne/dev/config.properties filen indeholder den konfiguration, der bruges i udviklingsmiljøet.
  • profilerne/prod/config.properties filen indeholder den konfiguration, der bruges i produktionsmiljøet.
  • profilerne/test/config.properties filen indeholder den konfiguration, der bruges i testmiljøet.

Disse egenskabsfiler konfigurerer filstien til logfilen, der indeholder loggen for vores eksempelapplikation.

Udviklingsprofilens konfigurationsfil ser ud som følger:

log.filename=logs/dev.log

Konfigurationsfilen for produktionsprofilen ser ud som følger:

log.filename=logs/prod.log

Konfigurationsfilen for testprofilen ser ud som følger:

log.filename=logs/test.log

Vi har nu oprettet egenskabsfilerne, der angiver placeringen af ​​vores logfil. Vores næste trin er at oprette et build-script, der erstatter pladsholderen fundet fra src/main/resources/log4j.properties fil med den faktiske ejendomsværdi. Lad os se, hvordan vi kan gøre det.

Oprettelse af Build-scriptet

Vi kan oprette et Maven build-script, der erstatter pladsholderen fundet fra src/main/resources/log4j.properties fil med den faktiske ejendomsværdi ved at følge disse trin:

  1. Konfigurer udviklings-, produktions- og testprofilerne.
  2. Konfigurer placeringen af ​​egenskabsfilerne, der indeholder konfigurationen af ​​hver Maven-profil.
  3. Konfigurer placeringen af ​​vores ressourcer og aktiver ressourcefiltrering.

Først , har vi konfigureret udviklings-, produktions- og testprofilerne i vores pom.xml fil. Vi kan gøre dette ved at følge disse trin:

  1. Opret udviklingsprofilen, og konfigurer den til at være aktiv som standard. Angiv en egenskab kaldet build.profile.id og indstil dens værdi til 'dev'.
  2. Opret produktionsprofilen. Angiv en egenskab kaldet build.profile.id og indstil dens værdi til 'prod'.
  3. Opret testprofilen. Angiv en egenskab kaldet build.profile.id og indstil dens værdi til 'test'.

Vi kan afslutte disse trin ved at tilføje følgende XML til vores pom.xml fil:

<!-- Profile configuration -->
<profiles>
    <!-- The configuration of the development profile -->
    <profile>
        <id>dev</id>
        <!-- The development profile is active by default -->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <!--
                Specifies the build.profile.id property that must be equal than the name of
                the directory that contains the profile specific configuration file.
                Because the name of the directory that contains the configuration file of the
                development profile is dev, we must set the value of the build.profile.id 
                property to dev.
            -->
            <build.profile.id>dev</build.profile.id>
        </properties>
    </profile>
    <!-- The configuration of the production profile -->
    <profile>
        <id>prod</id>
        <properties>
            <!--
                Specifies the build.profile.id property that must be equal than the name of
                the directory that contains the profile specific configuration file.
                Because the name of the directory that contains the configuration file of the
                production profile is prod, we must set the value of the build.profile.id 
                property to prod.
            -->
            <build.profile.id>prod</build.profile.id>
        </properties>
    </profile>
    <!-- The configuration of the testing profile -->
    <profile>
        <id>test</id>
        <properties>
            <!--
                Specifies the build.profile.id property that must be equal than the name of
                the directory that contains the profile specific configuration file.
                Because the name of the directory that contains the configuration file of the
                testing profile is test, we must set the value of the build.profile.id 
                property to test.
            -->
            <build.profile.id>test</build.profile.id>
        </properties>
    </profile>
</profiles>

Anden , skal vi konfigurere Maven til at indlæse egenskabsværdierne fra den korrekte config.properties-fil . Vi kan gøre dette ved at tilføje følgende XML til build sektion af vores POM-fil:

<filters>
    <!--
        Ensures that the config.properties file is always loaded from the
        configuration directory of the active Maven profile.

    -->
    <filter>profiles/${build.profile.id}/config.properties</filter>
</filters>

Tredje , skal vi konfigurere placeringen af ​​vores ressourcekatalog og aktivere ressourcefiltrering. Vi kan gøre dette ved at tilføje følgende XML til build sektion af vores POM-fil:

<resources>
    <!--
        Placeholders that are found from the files located in the configured resource
        directories are replaced with the property values found from the profile
        specific configuration file.
    -->
    <resource>
        <filtering>true</filtering>
        <directory>src/main/resources</directory>
    </resource>
</resources>

Vi har nu konfigureret vores build-script til at erstatte de pladsholdere, der findes fra vores ressourcer (filer, der findes fra src/main/resources mappe) med de faktiske ejendomsværdier. Lad os gå videre og finde ud af, hvad det egentlig betyder.

Hvad har vi lige gjort?

Vi har nu oprettet et build-script, der erstatter de pladsholdere, som vores ressourcer fandt, med de egenskabsværdier, der findes fra den profilspecifikke konfigurationsfil.

Med andre ord, hvis vi kompilerer vores projekt ved at køre kommandoen:mvn clean compile -P test ved kommandoprompten, log4j.properties fil fundet fra målet/klasserne biblioteket ser ud som følger (den relevante del er fremhævet):

log4j.rootLogger=DEBUG, R

log4j.appender.R=org.apache.log4j.FileAppender
log4j.appender.R.File=logs/test.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

Som vi kan se, var pladsholderen, der var værdien af ​​log4j.appender.R.File egenskaben blev erstattet med den faktiske egenskabsværdi, der blev læst fra profiles/test/config.properties fil.

Lad os gå videre og opsummere, hvad vi lærte af dette blogindlæg.

Oversigt

Dette blogindlæg har lært os to ting:

  • Hvis vi skal bruge forskellige konfigurationsfiler i forskellige miljøer, er brug af Maven-profiler en måde at løse det problem på.
  • Hvis vi skal erstatte pladsholdere fundet fra vores ressourcefiler med de faktiske egenskabsværdier, kan vi løse dette problem ved at bruge ressourcefiltrering.

Java tag