【问题标题】:mvn install ignores hibernate mapping filesmvn install 忽略休眠映射文件
【发布时间】:2011-03-09 09:36:33
【问题描述】:

使用mvn install 命令将我的项目安装到本地存储库时,休眠映射文件会从生成的JAR 中排除。

我在 src/main/resources/traffic_domain/mapping/ 下有 *.hbm.xml 文件,所以应该没问题,因为它遵循标准目录布局对于 Maven。

我的 POM 文件如下所示:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>masters.traffic</groupId>
  <artifactId>traffic_domain</artifactId>
  <packaging>jar</packaging>
  <name>traffic_domain</name>  
  <version>0.1.0</version>   
  <build>
        <sourceDirectory>src</sourceDirectory>       
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>                    
                </configuration>
            </plugin>
        </plugins>
  </build>
...
</project>

目录结构如下:

traffic_domain
|-- pom.xml
|-- src
    |-- main
        |-- java
            |-- ...
        |-- resources
            |-- traffic_domain
                |-- mapping
                    |-- Access.hbm.xml
                    |-- *.hbm.xml

traffic_domain.jar 是我的 Web 应用程序 运行所需的 JAR 之一。在启动 tomcat 时,我遇到了这样的异常:

原因: org.hibernate.MappingNotFoundException: 资源: 主/资源/traffic_domain/mapping/Access.hbm.xml 找不到...

如何解决?


更新:好的(广告。Pascal Thivent评论),就是调用mvn clean package后生成的JAR内容:

c:\Users\jwa\Desktop\tets\traffic_domain\target>jar xvf traffic_domain-0.1.0.jar
  created: META-INF/
 inflated: META-INF/MANIFEST.MF
  created: main/
  created: main/java/
  created: main/java/traffic_domain/
  created: main/java/traffic_domain/bean/
  created: main/java/traffic_domain/logic/
  created: main/java/traffic_domain/tools/
 inflated: Access.hbm.xml
 inflated: District.hbm.xml
 inflated: main/java/traffic_domain/bean/Access.class
 inflated: main/java/traffic_domain/bean/District.class
 inflated: main/java/traffic_domain/bean/PostalCode.class
 inflated: main/java/traffic_domain/bean/Street.class
 inflated: main/java/traffic_domain/bean/TrafficCondition.class
 inflated: main/java/traffic_domain/logic/AccessFacade.class
 inflated: main/java/traffic_domain/logic/LocationFacade.class
 inflated: main/java/traffic_domain/logic/TrafficConditionFacade.class
 inflated: main/java/traffic_domain/tools/HibernateUtil.class
 inflated: PostalCode.hbm.xml
 inflated: Street.hbm.xml
 inflated: TrafficCondition.hbm.xml
  created: META-INF/maven/
  created: META-INF/maven/masters.traffic/
  created: META-INF/maven/masters.traffic/traffic_domain/
 inflated: META-INF/maven/masters.traffic/traffic_domain/pom.xml
 inflated: META-INF/maven/masters.traffic/traffic_domain/pom.properties

为了比较,这里是 Eclipce 创建的那个 JAR 的内容,它正在工作

C:\Users\jwa\Desktop\correct>jar xvf traffic_domain.jar
 inflated: main/java/traffic_domain/bean/PostalCode.class
 inflated: traffic_domain/mapping/Access.hbm.xml
  created: main/resources/
  created: main/resources/traffic_domain/
 inflated: traffic_domain/mapping/Street.hbm.xml
 inflated: main/java/traffic_domain/logic/AccessFacade.class
 inflated: main/resources/traffic_domain/mapping/TrafficCondition.hbm.xml
 inflated: traffic_domain/mapping/PostalCode.hbm.xml
  created: main/java/traffic_domain/bean/
 inflated: main/java/traffic_domain/tools/HibernateUtil.class
  created: main/
 inflated: main/java/traffic_domain/bean/TrafficCondition.class
 inflated: mapping/Street.hbm.xml
 inflated: PostalCode.hbm.xml
 inflated: main/java/traffic_domain/bean/Access.class
  created: traffic_domain/mapping/
 inflated: District.hbm.xml
  created: traffic_domain/
 inflated: traffic_domain/mapping/TrafficCondition.hbm.xml
  created: main/java/traffic_domain/tools/
 inflated: Access.hbm.xml
 inflated: traffic_domain/mapping/District.hbm.xml
  created: main/java/traffic_domain/logic/
  created: mapping/
  created: main/resources/traffic_domain/mapping/
 inflated: mapping/TrafficCondition.hbm.xml
 inflated: main/resources/traffic_domain/mapping/Access.hbm.xml
 inflated: mapping/Access.hbm.xml
 inflated: main/java/traffic_domain/bean/Street.class
  created: main/java/
 inflated: main/java/traffic_domain/logic/TrafficConditionFacade.class
 inflated: main/resources/traffic_domain/mapping/PostalCode.hbm.xml
  created: main/java/traffic_domain/
 inflated: TrafficCondition.hbm.xml
 inflated: main/resources/traffic_domain/mapping/District.hbm.xml
 inflated: mapping/PostalCode.hbm.xml
 inflated: Street.hbm.xml
 inflated: main/resources/traffic_domain/mapping/Street.hbm.xml
 inflated: main/java/traffic_domain/logic/LocationFacade.class
 inflated: main/java/traffic_domain/bean/District.class
 inflated: mapping/District.hbm.xml

这是 hibernate.cfg.xml 的一部分,它正在加载映射(在 axtavt 建议之后更改):

<mapping resource="traffic_domain/mapping/Access.hbm.xml"/>
<mapping resource="traffic_domain/mapping/Street.hbm.xml"/>
<mapping resource="traffic_domain/mapping/District.hbm.xml"/>
<mapping resource="traffic_domain/mapping/PostalCode.hbm.xml"/>
<mapping resource="traffic_domain/mapping/TrafficCondition.hbm.xml"/>

【问题讨论】:

  • “我在 src/main/resources/traffic_domain/mapping/ 下有 *.hbm.xml 文件,所以应该没问题,因为它遵循 maven 的标准目录布局。”如果您知道您使用的是标准的 maven 目录结构,为什么要在 pom.xml 中明确指定您的源目录?正如 Pascal 已经提到的,删除 元素肯定会解决问题。
  • 大家好,最后我把我的 3 个项目中的所有东西都改成了标准的 maven 目录布局。说到 m2eclipse,其实我之前一直在使用 m2eclipse,但我并没有像应该使用的那样正确使用它。现在我已经学会了如何使用它。现在好了,我在 *.jar 文件中没有垃圾,目录结构还可以,我认为一切都是正确的。再次感谢。

标签: java hibernate maven-2


【解决方案1】:

查看异常:

引起:org.hibernate.MappingNotFoundException:资源: main/resources/traffic_domain/mapping/Access.hbm.xml 在...上找不到。

Hibernate 尝试在main/resources/traffic_domain/mapping/Access.hbm.xml 找到一个映射文件,而它应该以traffic_domain/mapping/Access.hbm.xml 访问。可能您在.cfg.xml 中指定了错误的映射文件路径。

【讨论】:

  • 不,这不是问题,因为在Eclipse中构建traffic_domain项目时,一切正常,找到Access.hbm.xml没有问题。只有在使用 Maven 构建 traffic_domain 项目时才会出现该错误。
  • @Jarek 这是问题所在。如果它像您所说的那样在 Eclipse 中工作,那么您使用的 Maven 目录布局不正确。 Maven 目录布局期望main/resources 是类路径的一部分,因此您的文件可以作为名为@9​​87654325@ 的类路径资源访问。如果您使用 m2eclipse,它会自动完成。否则,您可以在项目属性的类路径中添加main/resources
  • 您好,我已经更改了 hibernate.cfg.xml 文件中的路径(更改为 traffic_domain/mapping/Access.hbm.xml),但我仍然遇到同样的问题。
  • @Jarek 您的情况似乎比简单的 maven 布局更复杂,所以请参阅 Pascal 的回答。
【解决方案2】:

默认,来自src/main/resources 的资源应该在构建过程中被复制到target/classes。但正如我在your previous question 中提到的,这里的问题是以下行:

<sourceDirectory>src</sourceDirectory> 

由于这一行,Maven 将src 下的所有内容视为源,并将main/resources 复制到target/classes。因此,当您使用“默认布局”时,您仍然没有使用 Maven 的默认配置,而是将src/main/resources 的内容复制到target/classes,而不是包含main/resources

所以,正如我在my answer 中建议的那样,使用 Maven 的默认设置(默认布局、默认配置),尤其是如果您是 Maven 初学者:

  • 将您的 Java 源代码移动到 src/main/java(并删除 sourceDirectory 元素)

我不知道在 Eclipse 下是如何工作的……但你的 POM 显然不正确。


跟进:您的项目仍然有一些非常错误的地方:main/java 不应该是包名的一部分,为什么资源最终会出现在 jar 的根目录中?你能展示一下你的 POM 的最新版本吗?

关于 Eclipse 生成的 jar,它可能可以正常工作,但是当我看到它时唯一看到的是 巨大的混乱(重复文件、错误的 Java 打包等)。这可能是由于 Maven 项目设置和 Eclipse 项目设置之间的差异造成的。

我不知道您是否使用m2eclipse,但这是我的建议。 Eclipse 下的项目设置需要与 Maven 项目设置保持一致,目前不是。 m2eclipse 可以通过从 POM 派生设置来为您做到这一点。

【讨论】:

  • 你好,正如你所说,我已经从 POM 文件中删除了 sourceDirectory 条目,因为我现在有标准布局。事实上, *.hbm.xml 文件是在调用 mvn compile 命令后在 target/classes 下创建的。但是,在 JAR 文件中,在调用 mvn package 命令后,它们仍然不包括在内,而且我仍然遇到那个令人毛骨悚然的异常..
  • @Jarek 这很奇怪,因为mvn package 只不过是在刺激target/classes。您能否运行 mvn clean package 并使用生成的 jar (jar xvf target/traffic_domain-0.1.0.jar) 的内容更新问题。我现在怀疑另一个问题(你如何告诉休眠加载映射?)
【解决方案3】:

如果您需要在阶段编译时包含 *.hbm.xml;编辑你的 pom.xml 并添加下一个代码:

<build>
                <resources>
            <resource>
                <directory>source/com/qfund/orm/</directory>
                <targetPath>com/qfund/orm/</targetPath>
                <includes>
                    <include>*.hbm.xml</include>
                </includes>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/java/</directory>
                <includes>
                    <include>*.xml</include>
                    <include>*.xsd</include>
                    <include>*.xslt</include>
                    <include>*.properties</include>
                </includes>
            </testResource>
        </testResources>
</build>

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多