开发者

mvn install ignores hibernate mapping files

While installing my project to local repository with mvn install command, hibernate mapping files are excluded from generated JAR.

I have the *.hbm.xml files under src/main/resources/traffic_domain/mapping/, so it should be ok as it is following standard directory layout for maven.

my POM file looks like that:

<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>

Directory structure is following:

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

traffic_domain.jar is one of JARs needed for my web application to run. While starting tomcat, I'm getting such exception:

Caused by: org.hibernate.MappingNotFoundException: resource: main/resources/traffic_domain/mapping/Access.hbm.xml not found at...

How to fix that ?


Update: Ok (ad. Pascal Thivent comment), that is the content of generated JAR after invoking mvn clean package:

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

For comparison, here is the content of that JAR created by Eclipce, which is working:

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

Here is the part of hibernate.cfg.xml, which is loading the mappings (changed after axtavt advice):

<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"/>


By default, resources from src/main/resources are supposed to be copied during the build process into target/classes. But as I mentioned in your previous question, the problem here is the following line:

<sourceDirectory>src</sourceDirectory> 

Because of this line, Maven is considering everything under src as sources and main/resources gets copied to target/classes. So, while you are using the "default layout", you are still not using Maven's default configuration and, instead of having the content of src/main/resources copied to target/classes, main/resources is included.

So, as I recommended in my answer, use Maven's defaults (default layout, default configuration), especially if you are a Maven beginner:

  • move your Java sources into src/main/java (and remove the sourceDirectory element)

I have no idea how things are working under Eclipse... but your POM is clearly incorrect.


Follow-up: There is still something very wrong with your project: main/java is not supposed to be part of the package name and why do resources end up at the root of the jar? Could you show the latest version of your POM?

Regarding the jar produced by Eclipse, it may be working but the only thing I see when I look at it is a huge mess (duplicate files, wrong Java packaging, etc). This may result from differences between the Maven project setup and the Eclipse project setup though.

I don't know if you are using m2eclipse, but that would be my suggestion here. The project setup under Eclipse needs to be aligned with the Maven project setup and it currently isn't. m2eclipse can do that for you by deriving the settings from the POM.


If you need include *.hbm.xml on the phase compile; edit your pom.xml and add the next code:

<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>


Look at the exception:

Caused by: org.hibernate.MappingNotFoundException: resource: main/resources/traffic_domain/mapping/Access.hbm.xml not found at...

Hibernate tries to find a mapping file at main/resources/traffic_domain/mapping/Access.hbm.xml, when it should be accessed as traffic_domain/mapping/Access.hbm.xml. Probably you specified the wrong path to your mapping file in .cfg.xml.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜