How do I get Eclipse to resolve classes generated with Maven 2?

前端 未结 9 874
日久生厌
日久生厌 2020-12-12 22:11

I\'m using Google Protocol Buffers to generate some Java classes for my project. Using Maven 2 and its \"antrun\" plugin, these classes are freshly generated before compile,

相关标签:
9条回答
  • 2020-12-12 22:20

    Did you try to refresh the Eclipse project?


    (source: oyvindhauge.com)

    When an external tool generate new files or updates old ones, Eclipse will not be able to detect the change until the next request.

    Another option would be to define a new Custom builder, specifying for that builder to "refresh resources upon completion":

    alt text http://www.cs.lth.se/EDA180/2005/Verktyg/eclipse_refresh.gif

    0 讨论(0)
  • 2020-12-12 22:23

    To generate Java source files from .proto files use Protocol Buffers Plugin which works out-of-the-box in eclipse Oxygen.

    Basic usage (see here for detailed description):

    • make sure that native protoc compiler is installed on your system

    • update your pom.xml file:

      • make sure you use at least Java 6 (Java 7+ is recommended)

      • add plugin invocation

      • add the corresponding dependency for com.google.protobuf:protobuf-java

    • put your .proto files inside project's src/main/proto directory

    • update the project (via Maven -> Update project...)

    Example pom.xml:

    <project>
      ...
      <build>
        <plugins>
          <!-- Require at least Java 6 -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </plugin>
          <!-- Generate .java files from .proto definitions -->
          <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.5.1</version>
            <configuration>
              <protocExecutable>/usr/local/bin/protoc</protocExecutable>
            </configuration>
            <executions>
              <execution>
                <goals>
                  <goal>compile</goal>
                  <goal>test-compile</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          ...
        </plugins>
      </build>
      <dependencies>
        <dependency>
          <groupId>com.google.protobuf</groupId>
          <artifactId>protobuf-java</artifactId>
          <version>3.5.1</version>
        </dependency>
        ...
      </dependencies>
      ...
    </project>
    

    Some additional notes:

    • if protoc executable is in the PATH the protocExecutable configuration entry can be omitted

    • test-only protobuf message definitions can be put into project's src/test/proto directory

    • I recommend installing Protocol Buffer Descriptor Editor (marketplace link)

    Good luck!

    0 讨论(0)
  • 2020-12-12 22:24

    I had this issue with code generated using Maven and wsdl2java and here's what I did in Eclipse Juno to resolve it. Assume my project is named project1:

    1. Right-click project1 and select Properties
    2. Choose Java Build Path from the left and select the Libraries tab
    3. Click Add Class Folder
    4. Select the bin directory and click OK (project1/target/generated-sources/bin)
    5. Click OK and Refresh the project

    As an added bonus you can also attach the source code:

    1. Click the arrow next to the new class folder you just created
    2. Click on Source attachment
    3. Click the Edit button
    4. Set the Path to /project1/target/generated-sources/axis2/src
    5. Click OK
    0 讨论(0)
  • 2020-12-12 22:25

    m2eclipse supports this. First, add the path to your build path:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.8</version>
        <executions>
            <execution>
                <id>add-source</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>add-source</goal>
                </goals>
                <configuration>
                    <sources>
                        <source>${project.build.directory}/generated-sources/java/</source>
                    </sources>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    Second, add support for that to m2e:

    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                          <pluginExecutions>
                            <pluginExecution>
                              <pluginExecutionFilter>
                                <groupId>org.codehaus.mojo</groupId>
                                <artifactId>build-helper-maven-plugin</artifactId>
                                <versionRange>[1.0,)</versionRange>
                                <goals>
                                  <goal>parse-version</goal>
                                  <goal>add-source</goal>
                                  <goal>maven-version</goal>
                                  <goal>add-resource</goal>
                                  <goal>add-test-resource</goal>
                                  <goal>add-test-source</goal>
                                </goals>
                              </pluginExecutionFilter>
                              <action>
                                <execute>
                                  <runOnConfiguration>true</runOnConfiguration>
                                  <runOnIncremental>true</runOnIncremental>
                                </execute>
                              </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    

    The second step might not be necessary, if your eclipse installation has installed the "org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml" plugin. This plugin is available via Window -> Preferences -> Maven -> Discovery. Currently, that does not work here at Eclipse Kepler, therefore, I fetched the JAR (linked from the xml shown in the Catalog URL) and extracted the fragments from org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml by hand.

    0 讨论(0)
  • 2020-12-12 22:30

    How can I get IDE support (code completion etc.) for the generated code?

    Typically I would add the m2e lifecycle-mapping plugin to the pom.xml file as described in @koppor's answer. However adding per-eclipse code to my pom.xml files is not an option at work which is mostly an IntelliJ shop.

    My solution first adds the build-helper-maven-plugin to the pom.xml which works fine from the command line but not in eclipse.

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>add-source</goal>
                </goals>
                <configuration>
                    <sources>
                        <source>${project.build.directory}/generated-sources/</source>
                    </sources>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    To fix eclipse I installed the Apt M2E Connector from the Eclipse Marketplace. I think things started working right after I restarted and then rebuilt all of my projects. I now see the following in my source dirs:

    src/main/java
    target/generated-sources
    ...
    

    Feature!

    0 讨论(0)
  • 2020-12-12 22:32

    Personally I resolved this problem by setting up the generated classes as a seperate project and made it a dependency in my main (non-generated) project. I was using wsdl2java to generate webservice classes so the "source" in my sub-project was the wdsl and xsds. Worked well even when the wsdl was changing regularly.

    0 讨论(0)
提交回复
热议问题