简体   繁体   中英

Is it possible to configure maven to compile generated sources wouthout the use of a plugin?

I know this question is not new. But it seems that there is no definite answer. This answer from 2012 states that if generated sources are placed under target/generated-sources/<tool> they will be compiled. ANTLR 4 maven plugin follows this paradigm. Per documentation, the default value of outputDirectory is: ${project.build.directory}/generated-sources/antlr4 .

Now in my case I have a custom tool that generates sources. I've set its output directory to be at ${project.build.directory}/generated-sources/whatever and it didn't work. Regarding the whatever part, I've tried to use the id of the goal that generates the sources and even tried to hijack antlr4 name. No result though.

When I try this solution that suggests using mojo build-helper-maven-plugin it compiles as expected. But according to maven guide to generating sources it should be working without any helper plugin, shouldn't it? Am I missing something?


Here is the POM (fragment) configuration that I use to generate the sources.

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.4.0</version>
    <executions>
        <execution>
            <id>generate-code</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>java</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <includeProjectDependencies>false</includeProjectDependencies>
        <includePluginDependencies>true</includePluginDependencies>
        <executableDependency>
            <groupId>com.company.product</groupId>
            <artifactId>CodeGenerator</artifactId>
        </executableDependency>
        <arguments>
            <argument>${basedir}/</argument>
            <argument>${project.build.directory}/generated-sources/generate-code/</argument>
        </arguments>
        <mainClass>com.company.codegeneration.CodeGenerator</mainClass>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>com.company.product</groupId>
            <artifactId>CodeGenerator</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>jar</type>
        </dependency>
    </dependencies>
</plugin>

Your understanding is just a bit incorrect.

Nothing automatic, plugins generating source code typically handle that by adding their output directory (something like target/generated-sources/ by convention) as source directory to the POM so that it will be included later during the compile phase.

Some less well implemented plugins don't do that for you and you have to add the directory yourself, for example using the Build Helper Maven Plugin.

As the other answer noted, most plugins typically add the generated code as new source path.

Ex: See antlr4's Antlr4Mojo.java class. Here, the plugin is adding the generated classes to project source by calling addSourceRoot method in execute method.

    //  Omitted some code
  void addSourceRoot(File outputDir) {
            if (generateTestSources) {
                project.addTestCompileSourceRoot(outputDir.getPath());
            }
            else {
                project.addCompileSourceRoot(outputDir.getPath());
            }
          }


    //  Omitted some code

 @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
    //  Omitted code
        if(project!=null)

        {
            // Tell Maven that there are some new source files underneath the output
            // directory.
            addSourceRoot(this.getOutputDirectory());
        }
}
    //  Omitted some code

So, you can either do this in your custom plugin or use the build-helper-maven-plugin .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM