mikeb
mikeb

Reputation: 11265

Maven plugin not running where I want it to

I have a maven project that I want to load properties from a file when things happen. I've got the codehaus properties-maven-plugin and I need it to run automagically.

If I run mvn test or mvn compile, the task plugin load the properties file just fine.

I see this in the output: [INFO] --- properties-maven-plugin:1.0-alpha-2:read-project-properties (default)...--- When I run mvn flyway:init, say, I do not see it run and the properties do not get loaded.

Here is the pom.xml:

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.foo</groupId>
    <artifactId>workflow</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Foo Framework</name>
    <description>Foo framework</description>
    <properties>
        <postgre.version>9.1-901.jdbc4</postgre.version>
        <flyway.version>2.2.1</flyway.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>${postgre.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>com.googlecode.flyway</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>2.2.1</version>
                <configuration>
                    <url>${url}</url>
                    <user>${user}</user>
                    <password>${pass}</password>
                    <locations>
                        <location>classpath:sql/pgsql</location>
                    </locations>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>postgresql</groupId>
                        <artifactId>postgresql</artifactId>
                        <version>${postgre.version}</version>
                    </dependency>
                </dependencies>
      </plugin>
            <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0-alpha-2</version>
        <executions>
          <execution>
                        <phase>initialize</phase>
            <goals>
              <goal>read-project-properties</goal>
            </goals>
            <configuration>
              <files>
                <file>src/main/resources/db.properties</file>
              </files>
            </configuration>
          </execution>
        </executions>
            </plugin>
        </plugins>
    </build>
</project>

Can anyone suggest what I can do, or some documentation I can read to make this work? I have read plenty of maven documentation and cannot seem to understand it well enough to make this happen. I thought what I have here would make it run during the initialize phase, but evidently not...

Upvotes: 3

Views: 2502

Answers (1)

user944849
user944849

Reputation: 14951

You are close. There is a difference between running Maven using a phase, and using a goal. Start with a quick review of the Maven lifecycle documentation.

When you run mvn compile, Maven runs all goals bound to the compile phase, plus anything bound to earlier phases. You have bound the properties:read-project-properties goal to the initialize phase. initialize is one of the first phases, so read-project-properties executes when compile, or test, or any of the later phases are used in the command.

When you run mvn flyway:init, you are only running a single goal, not the entire lifecycle. Thus, the only thing that runs with that command is the flyway-maven-plugin's init goal, nothing else.

If you want those two goals to run together, you could try binding the flyway:init goal to the initialize phase (if that is not the default; I could not tell from reading the plugin's documentation). Then, mvn initialize will run both.

If you don't want to bind flyway:init to a phase, then you may run both goals explicitly with mvn flyway:init initialize.

Upvotes: 7

Related Questions