Обновление: поскольку на данный момент есть только один ответ, я попытаюсь описать его лучше.
Короче говоря, мое тестовое приложение отлично работает в eclipse и при запуске с mvn exec, но создание работающего/работающего исполняемого пакета jar не работает для этого проекта.
Теперь более подробное описание. Я изучаю Java около 8 месяцев и использую maven для настройки проектов сборки и Eclipse в качестве IDE для написания и отладки. В настоящее время я пытаюсь сделать несколько небольших проектов баз данных, используя Spring, Hibernate и для тестирования H2. Классы DAO используют entityManager. Компиляция и запуск моего тестового приложения отлично работают в eclipse и в maven. В затмении я использую:
mvn exec:java -Dexec.mainClass="maven.springhibernateh2.basic.CRUDTest"
Это прекрасно работает. Моя проблема начала создавать и запускать исполняемый файл jar. Обычно я добавляю раздел плагина в pom.xml, например:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>maven.springhibernateh2.basic.CRUDTest</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Обычно этого достаточно, когда команда maven exec работает и выглядит, например.
mvn exec:java -Dexec.mainClass="maven.springhibernateh2.basic.CRUDTest"
К сожалению, у меня возникают проблемы в этом проекте. Сообщение об ошибке:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: проблема с конфигурацией: невозможно найти Spring NamespaceHandler для пространства имен схемы XML [http://www.springframework.org/schema/tx] Оскорбительный ресурс: ресурс пути к классу [Beans.xml]
Поскольку проекты обычно выполняются, я ожидаю, что создание исполняемого файла jar будет иметь некоторые проблемы, и я предполагаю, что в pom.xml чего-то не хватает в сочетании с определением bean-компонентов.
Теперь два файла pom.xml и Beans.xml.
Вот мой pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>roland.egger</groupId>
<artifactId>maven.springhibernateh2.basic</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>maven.springhibernateh2.basic.CRUDTest</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<slf4j.version>1.7.30</slf4j.version>
<spring.version>5.2.5.RELEASE</spring.version>
<hibernate.version>5.4.12.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api -->
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.2.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- Fuer den RollingFileAppender -->
<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
</project>
Вот мой Beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
<context:component-scan base-package="maven.springhibernateh2.basic"></context:component-scan>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="${db.driverClassName}"></property>
<property name="url" value="${db.url}"></property>
<property name="username" value="${db.username}"></property>
<property name="password" value="${db.password}"></property>
</bean>
<bean
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>database.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
<!-- Definition des JpaTransactionManagers -->
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- Activation of @Transactional Annotation. For a simple example without aspectj mode to
reduce the dependency complexity -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="roland.egger.maven.springhibernate" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- The next line is important making the proxy working -->
<aop:config proxy-target-class="true"/>
</beans>
Я провел несколько экспериментов по предложению Слободана Маргетича (спасибо :-)), но, к сожалению, это не помогло. Изменение файла Beans.xml привело к тому, что приложение вообще перестало работать. Поскольку мое тестовое приложение работало в Eclipse и в maven, я ожидаю, что Beans.xml должен быть правильным, но ожидаю, что pom.xml что-то пропустит.
Я нашел это: https://www.baeldung.com/unable-to-locate-spring-namespacehandler-for-xml-schema-namespace Поскольку у меня есть зависимость spring-tx в моем pom.xml, она должна нормально работать. К сожалению, это не работает. В конце человек по имени Ануджа написал: «Некоторые из пружинных банок содержат метаинформационные файлы с таким же именем». Следовательно, чтобы избежать переопределения некоторых метафайлов, я использовал maven-shade-plugin для их слияния. «Возможно, это может иметь место и для моего проекта. Как я могу это проверить? Есть ли у кого-нибудь опыт работы с maven-shade-plugin или предложение, что я могу попытаться найти решение?