8

我首先使用 CXF教程 遵循本合同。

一切进展顺利,包括从 WSDL 生成源代码,使用,build-helper-maven-plugin但是当“实现服务”的时候,即将生成的源文件夹移动RegistryResourceImpl.java到正常的源文件夹src/main/java,Eclipse 开始抱怨一些符号(如界面RegistryResource)无法识别。

意识到为普通src/main/java文件夹分配了不同的包名,我只是在RegistryResourceImpl.java导入中添加了所属包的导入RegistryResource.java

import com.yourcompany.sample.ns.RegistryResource;

但是 Eclipse 在其当前的项目配置中似乎是盲目的com.yourcompany.sample.ns,不知道在哪里可以找到它。

我尝试在构建路径中找到一个选项来指向生成的源,但我尝试过的都没有帮助。

我有一种感觉,我错过了一些非常微不足道的东西,但它是什么?

另外,m2e(Eclipse 的 Maven 插件)不应该已经自动处理那种移动的实现文件吗?

更新(在尝试@Patrick 建议的解决方案之后):

  1. target/generated/src/main/java不存在,但选中“创建新文件夹”框,我能够创建它。
  2. 但是,在 pom.xml > Run As >Maven clean上,它会被删除(因此需要在每次清理后重新创建???)
  3. 如果清理后没有重新创建,则执行 pom.xml > Run As > Maven install,在完全不同的树下创建生成源:generated-sources/cxf/com/yourcompany/sample/ns. 为什么???
  4. 然而,该RegistryResourceImpl.java模块仍然在target/generated sources. 在这一点上,我不再看到有关“未解决的包/导入/符号”(奇怪)的投诉。
  5. 但是......一旦它被移动到非目标文件夹/包,即 src/main/java 下的 com.yourcompany.sample.ns,“import com.yourcompany.sample.ns.RegistryType;” 无法再次解决!

另一方面,如果我尝试将实际生成的路径添加为“源文件夹” generated-sources/cxf/com/yourcompany/sample/ns(而不是不相关/不存在target/generated/src/main/java的,生成的树target将被移动(删除)到 under /src/main/java。我不明白这种行为蚀。

最后,即使我在此处Maven执行>Update Project建议,从而摆脱“Maven 2 项目错误图标”,该模块仍然显示未解析的符号,尽管整个项目构建得非常好!RegistryResourceImpl.java

这有什么可以解释的?

是否有可能build-helper-maven-plugin不完整甚至损坏?

有没有办法让 CXF +build-helper-maven-plugin与 Eclipse 和谐地工作,这样即使项目成功构建,我也看不到“未解析符号”的那些令人不安的红色下划线?

4

4 回答 4

7

您需要在 Eclipse 中为生成的源代码添加一个源文件夹。该教程在其评论中提到了这一点“注意:M2Eclipse 似乎没有选择这个源文件夹,因此您必须在 eclipse 中手动添加它。” 如果您按照教程中的说明进行操作,则需要添加的位置应该是(相对于您的项目目录)

target/generated/src/main/java

要添加文件夹,请打开您的项目属性并从左侧菜单中选择“Java Build Path”。在“Source”选项卡中,按“Add Folder...”按钮,然后选择“target/generated/src/main/java”作为源文件夹。

请注意,Maven 在运行mvn clean install. 您可能希望在运行此命令时将 Eclipse 配置为刷新资源,以避免不一致。Eclipse 运行配置包括一个 Refresh 选项卡,允许您启用“完成时刷新资源”。

您可能考虑的另一个选择是跳过使用 Maven 来满足您的wsimport需求。我会直接调用wsimport,将生成的工件放在你的src/main/java文件夹下,然后就可以完成了。除非您真的需要在每次构建时重新生成工件,否则我认为 Maven 插件比它的价值更麻烦。

于 2013-08-09T19:19:06.393 回答
3

如果清理后没有重新创建,执行 pom.xml > Run As > Maven install,在完全不同的树下创建生成源:generated-sources/cxf/com/yourcompany/sample/ns。为什么???

您需要配置cxf-codegen-plugin以将生成的代码输出到所需的文件夹。

...
<configuration>
    <sourceRoot>${basedir}/target/generated/src/main/java</sourceRoot>
    ...  
</configuration>  

然后为 cxf-codegen-plugin 安装一个连接器(即,如果有的话)或使用 maven build-helper-maven-plugin及其连接器。确保sources指向与 相同的位置sourceRoot

<configuration>
    <sources>
        <source>${basedir}/target/generated/src/main/java</source>
    </sources>
</configuration>

ps:要安装/发现连接器,请访问Preferences -> Maven -> Discover

于 2013-08-16T15:16:12.643 回答
0

问题是生成的源文件夹有许多其他类定义,该类也需要这些定义RegistryResourceImpl。您需要将生成的源文件夹添加为 maven pom 中的源代码位置。一个类似的问题有一个不错的答案

改编自该答案:

 <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <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>
于 2013-08-02T22:39:33.257 回答
0

您确定要在每次构建时生成这些源吗?从外观上看,来自cxf-codegen-plugin的generate-sources仅生成存根文件,然后您必须修改(您提到的“实施服务”部分)以完全完成文件。在这种情况下,您不希望生成源在每次构建时都覆盖您的文件,不是吗?这应该是你必须明确调用的东西(一个 Maven配置文件将是一个很好的候选人;或者可能会触发对 wsdl 文件的编辑)。然后,您可以在明确请求时生成目标或任意(非源)目录,并将这些文件拉/合并到标准 src/main/java 部分。如果文件是完整生成的,那么这将是一个不同的故事,但是由于您需要先生成然后编辑然后完整构建,所以它并不是真正的一次性交易......

于 2013-08-15T22:50:47.537 回答