0

我正在使用 Elipse Indigo、maven 2.2.1、m2e 1.0.2、用于 wtp 0.15.2 的 maven 集成、用于 JiBX 1.2.3 的 m2e 连接器。

我有一个包含 jibx 绑定的共享 maven jar 工件。.project 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>my-binding</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
            <buildCommand>
                <name>org.eclipse.wst.common.project.facet.core.builder</name>
            <arguments>
                </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.jibx.eclipse.JibxBindingBuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.m2e.core.maven2Builder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.wst.validation.validationbuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
        <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
        <nature>org.eclipse.jdt.core.javanature</nature>
        <nature>org.eclipse.m2e.core.maven2Nature</nature>
        <nature>org.jibx.eclipse.JibxNature</nature>
        <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
    </natures>
    </projectDescription>

我已按照给出的说明设置m2e Maven Eclipse 插件。我使用 build-helper-maven-plugin(带有 eclipse 连接器)将生成的源包含在源文件夹中。

当我在 Eclipse 中编译它时,JiBX 绑定运行正常 - 我可以在 JiBX 控制台中看到输出,并在 target/classes 目录中看到修改后的类。

然后我在战争神器中使用这个生成的 jar。

项目文件:

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>my-webapp</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
        <buildCommand>
            <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.wst.common.project.facet.core.builder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.wst.validation.validationbuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.m2e.core.maven2Builder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
        <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
        <nature>org.eclipse.jdt.core.javanature</nature>
        <nature>org.eclipse.m2e.core.maven2Nature</nature>
        <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
        <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
    </natures>
</projectDescription>

我生成org.eclipse.wst.common.component的文件是(部分):

<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="my-webapp">
        <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
        <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
        <dependent-module archiveName="my-binding-1.79.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/my-binding/my-binding">
            <dependency-type>uses</dependency-type>
        </dependent-module>
        <property name="context-root" value="my-webapp"/>
        <property name="java-output-path" value="/my-webapp/target/classes"/>
    </wb-module>
</project-modules>

我使用“服务模块而不发布”和“从不自动发布”选项集运行 wtp。当试图在 jar 中引用 jibx 修改的类时,我java.lang.NoSuchMethodError在引用 JiBX 生成的方法时得到了标准。绑定项目的目标目录仍然包含 jibx 修改的类文件。

这可能是错误的路径,但是当我修改 jar 工件的 .project 文件以跳过 wtp 添加的性质时,它似乎可以工作,即使用以下命令重建 my-binding 项目:

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>my-binding</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
        <buildCommand>
            <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.jibx.eclipse.JibxBindingBuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.m2e.core.maven2Builder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.wst.validation.validationbuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>org.eclipse.jdt.core.javanature</nature>
        <nature>org.eclipse.m2e.core.maven2Nature</nature>
        <nature>org.jibx.eclipse.JibxNature</nature>
    </natures>
    </projectDescription>

..重新启动webapp,它工作正常。重建 webapp,性质被添加回绑定项目,它再次被破坏。

我在这里错过了一个技巧(我曾希望旧的 wtp-eclipse 舞蹈已成为过去)。有任何想法吗?

更新: 进一步播放后,我将其范围缩小到共享类上的损坏绑定

从命令行构建时,似乎所有绑定都是一次构建的(或者至少不更改依赖 jar 中的类),但是当通过 eclipse 插件构建时,各种项目“从早期的绑定”,根据本节的结构化绑定部分-工厂类被破坏。

我正在努力将公共类绑定提取到预编译的包含中,但这不是一项小工作——我们有很多共享类,并且在进行更改时一定会错过共享对象绑定。有什么方法可以标记(命名?)与每个项目关联的绑定,以便多个工厂类可以存在于公共类包中而不是覆盖它们,即

com.alfonzo.common 
    shared.class
    foobar1_JiBX_bindingFactory.class
    foobar2_jibx_bindingFactory.class

那么项目 foobar1,包括共享类的构建绑定可以引用它的工厂,而项目 foobar2 引用不同的工厂。

还是我完全误解了这一点?...

4

0 回答 0