【问题标题】:Generated sources being compiled twice生成的源代码被编译两次
【发布时间】:2015-09-25 18:38:49
【问题描述】:

将 Eclipse Luna 与 m2eclipse 结合使用,我有一个父 Maven 项目 (facturas_root) 和两个继承自它的 Maven 模块(sharepoint_wsapi_sharepoint)。

sharepoint_ws 仅用于生成 JAXWS 类以连接到 Sharepoint WebServices,因此我下载了相关的 WSDL 并将其包含为项目的资源。在generate-sources 阶段,它可以正常工作并生成target\generated-sources\ws-consume\mypackage\ 中的源。

现在,问题是我让api_sharepoint 导入了sharepoint_ws 依赖项,但它没有检测到任何类。我认为这是因为生成的类不在src/main/java,所以我添加了一个插件将它们复制到那里。现在,问题是sharepoint_ws在编译阶段,找到了每个类的两次源文件,并抛出错误。

我的 pom.xml -> 构建

<plugins>
  <!-- clean /src/main/java and /target/generated-sources -->
  <plugin>
    <artifactId>maven-clean-plugin</artifactId>
    <version>2.6.1</version>
    <executions>
      <execution>
        <phase>generate-sources</phase>
        <goals>
          <goal>clean</goal>
        </goals>
        <configuration>
          <filesets>
            <fileset>
              <directory>${basedir}/src/main/java/es</directory>
            </fileset>
            <fileset>
              <directory>${basedir}/target/generated-sources</directory>
            </fileset>
          </configuration>
        </execution>
      </executions>
    </plugin>

    <!-- generate jaxws -->
    <plugin>
      <groupId>org.jboss.ws.plugins</groupId>
      <artifactId>maven-jaxws-tools-plugin</artifactId>
      <version>1.1.2.Final</version>
      <executions>
        <execution>
          <phase>generate-sources</phase>
          <goals>
            <goal>wsconsume</goal>
          </goals>
          <configuration>
            <wsdls>
              <wsdl>${basedir}/resources/lists.wsdl</wsdl>
            </wsdls>
           <targetPackage>es.ssib.otic.facturas.sharepoint_ws</targetPackage>
            <outputDirectory>${basedir}/target/generated-sources</outputDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>

    <!-- copy sources -->
    <plugin>
      <artifactId>maven-resources-plugin</artifactId>
      <version>2.7</version>
      <dependencies>
        <dependency>
          <groupId>org.apache.maven.shared</groupId>
          <artifactId>maven-filtering</artifactId>
          <version>1.3</version>
        </dependency>
      </dependencies>
      <executions>
        <execution>
          <phase>generate-sources</phase>
          <goals>
            <goal>copy-resources</goal>
          </goals>
          <configuration>
            <outputDirectory>${basedir}/src/main/java</outputDirectory>
            <resources>
              <resource>
                <directory>${basedir}/target/generated-sources/wsconsume</directory>
                <filtering>true</filtering>
              </resource>
            </resources>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>

为了尝试排除target/generated-sources,我添加了这个:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
      <execution>
        <id>default-compile</id>
        <phase>compile</phase>
        <configuration>
          <excludes>
            <exclude>**/target/generated-sources/*.java</exclude>
          </excludes>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

如上所述,我确实评论了“复制”插件,依赖于sharepoint_ws 的模块没有任何可用的类;我确实使用它,但在

的曲调中出现错误

[错误] /C:/Users/s004256/workspace/facturas_root/sharepoint_ws/src/main/java/es/ssib/otic/facturas/sharepoint_ws/DeleteList.java:[34,8] 重复类:es。 ssib.otic.facturas.sharepoint_ws.DeleteList

对于每个生成的列表。

【问题讨论】:

    标签: maven m2eclipse


    【解决方案1】:

    首先,我建议您最好将target/generated-sources 声明为源文件夹,而不是到处复制文件:

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

    这应该足以让 Maven 编译 target/generated-sources/*.java 并将它们全部打包到库中,并且也让 Eclipse 将 target/generated-sources 识别为源目录(在执行 Maven/更新项目)。

    顺便说一句:您应该注意以正确的顺序将插件绑定到阶段:如果您将所有任务绑定到“生成源”,则无法保证以哪个顺序他们会被处决吗? “编译”阶段也是如此:您必须在编译阶段之前正确设置源文件夹及其包含和排除项。

    查看Default Maven Lifecycle 并尝试为您的任务选择不同的顺序阶段。

    【讨论】:

    • 感谢您的帮助。我做了您的更改(必须将initialize 更改为validate 才能使其工作,m2e 无法识别多个阶段),但它不起作用; jar 已编译并在其中包含页面,但相关模块仍然无法访问类;看起来问题是/target/classes 没有设置为“构建”文件夹(它存在于文件系统中,但它没有出现在项目资源管理器中)。
    • 哼...你说api_sharepoint项目还是不能访问sharepoint_ws类?但是,如果 sharepoint_ws-&lt;version&gt;.jar 生成良好,并且依赖关系在 api_sharepoint 中声明良好,则应该这样做。在api_sharepoint 上运行“mvn dependency:tree”以检查依赖声明是否正常。
    • 另一方面:关于 Eclipse 类路径问题:如果由于某种原因 Eclipse 没有将目标/生成源识别为源文件夹,请手动设置它:单击文件夹,显示上下文菜单并执行“用作源文件夹”。
    • 确保从 Preferences > Maven > Discovery > Open Catalog 安装 m2e buildhelper 连接器
    猜你喜欢
    • 2015-12-13
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2023-03-14
    相关资源
    最近更新 更多