仅休眠注释bundle



我正在寻找一个只包含休眠注释而不包含休眠核心的 Maven 工件。我尝试获得小模型捆绑包。

似乎在冬眠 3 之前有: https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations

常见的注释似乎不包含@Type等等 https://mvnrepository.com/artifact/org.hibernate.common/hibernate-commons-annotations

这种情况的最佳实践是什么?

免责声明:我不知道hibernate许可证是否允许

您可以将org.hibernate.annotations提取到最终的罐子中。 您将对hibernate-core具有编译时依赖性,但只有org.hibernate.annotations包将包含在最终的jar中。

使用maven-dependency-plugin

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>extract-hibernate-annotations</id>
<phase>process-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.7.Final</version>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<includes>org/hibernate/annotations/**</includes>
</configuration>
</execution>
</executions>
</plugin>

并且您必须添加hibernate-core作为您提供的依赖项:

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.7.Final</version>
<scope>provided</scope>
</dependency>

测试:

Main.java

import org.hibernate.annotations.SQLDelete;
@SQLDelete(sql = "delete from whatever where id = ?")
public class Main {
public static void main(String[] args) {
SQLDelete annotation = Main.class.getAnnotation(SQLDelete.class);
System.out.println("Sql delete = " + annotation);
System.out.println("Sql = " + annotation.sql());
try {
Class.forName("org.hibernate.Session");
} catch (ClassNotFoundException e) {
System.out.println("org.hibernate.Session is not present");
}
}
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>com.caco3</groupId>
<artifactId>so</artifactId>
<version>1.0-SNAPSHOT</version>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>extract-hibernate-annotations</id>
<phase>process-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.7.Final</version>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<includes>org/hibernate/annotations/**</includes>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>
Main
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.7.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

建:

$ mvn package
$ java -jar target/so-1.0-SNAPSHOT.jar

输出:

Sql delete = @org.hibernate.annotations.SQLDelete(callable=false, check=NONE, sql=delete from whatever where id = ?)
Sql = delete from whatever where id = ?
org.hibernate.Session is not present

罐子内容:

├── Main.class
├── META-INF
│   ├── MANIFEST.MF
│   └── maven
│       └── com.caco3
│           └── so
│               ├── pom.properties
│               └── pom.xml
└── org
└── hibernate
└── annotations
├── AccessType.class
├── Any.class
├── AnyMetaDef.class
├── AnyMetaDefs.class
├── AttributeAccessor.class
├── BatchSize.class
├── Cache.class
├── CacheConcurrencyStrategy$1.class
├── CacheConcurrencyStrategy.class
├── CacheModeType$1.class
├── CacheModeType.class
├── Cascade.class
├── CascadeType.class
├── Check.class
├── CollectionId.class
├── CollectionType.class
├── ColumnDefault.class
├── Columns.class
├── ColumnTransformer.class
├── ColumnTransformers.class
├── CreationTimestamp.class
├── DiscriminatorFormula.class
├── DiscriminatorOptions.class
├── DynamicInsert.class
├── DynamicUpdate.class
├── Entity.class
├── Fetch.class
├── FetchMode.class
├── FetchProfile$FetchOverride.class
├── FetchProfile.class
├── FetchProfiles.class
├── Filter.class
├── FilterDef.class
├── FilterDefs.class
├── FilterJoinTable.class
├── FilterJoinTables.class
├── Filters.class
├── FlushModeType.class
├── ForeignKey.class
├── Formula.class
├── Generated.class
├── GenerationTime.class
├── GeneratorType.class
├── GenericGenerator.class
├── GenericGenerators.class
├── Immutable.class
├── Index.class
├── IndexColumn.class
├── JoinColumnOrFormula.class
├── JoinColumnsOrFormulas.class
├── JoinFormula.class
├── LazyCollection.class
├── LazyCollectionOption.class
├── LazyGroup.class
├── LazyToOne.class
├── LazyToOneOption.class
├── ListIndexBase.class
├── Loader.class
├── ManyToAny.class
├── MapKeyType.class
├── MetaValue.class
├── NamedNativeQueries.class
├── NamedNativeQuery.class
├── NamedQueries.class
├── NamedQuery.class
├── Nationalized.class
├── NaturalIdCache.class
├── NaturalId.class
├── NotFoundAction.class
├── NotFound.class
├── OnDeleteAction.class
├── OnDelete.class
├── OptimisticLock.class
├── OptimisticLocking.class
├── OptimisticLockType.class
├── OrderBy.class
├── ParamDef.class
├── Parameter.class
├── Parent.class
├── Persister.class
├── Polymorphism.class
├── PolymorphismType.class
├── Proxy.class
├── QueryHints.class
├── ResultCheckStyle.class
├── RowId.class
├── SelectBeforeUpdate.class
├── Sort.class
├── SortComparator.class
├── SortNatural.class
├── SortType.class
├── Source.class
├── SourceType.class
├── SQLDeleteAll.class
├── SQLDelete.class
├── SqlFragmentAlias.class
├── SQLInsert.class
├── SQLUpdate.class
├── Subselect.class
├── Synchronize.class
├── Table.class
├── Tables.class
├── Target.class
├── Tuplizer.class
├── Tuplizers.class
├── Type.class
├── TypeDef.class
├── TypeDefs.class
├── UpdateTimestamp.class
├── ValueGenerationType.class
├── Where.class
└── WhereJoinTable.class

我不知道休眠罐子只会包含干净的注释,包括@Type,而没有其他与休眠相关的注释。

我试着猜测,你想得到一个jar,其中包含在导入中使用@Type注释但不依赖于休眠核心的代码。

对于这种情况,请使用提供的maven 范围。

谷歌说

Maven 依赖范围 – 提供。提供的 Maven 依赖范围是 在生成和测试项目期间使用。它们还需要运行, 但不应导出,因为依赖项将由 运行时,例如,按 servlet 容器或应用程序服务器。

这里的意思是">需要运行"和">将提供"是类路径必须加载

org.hibernate.annotations.Type 

从任何地方,很可能来自现有的休眠核心 jar,但实际上没有必要完全是休眠核心。Java 类坐标为 class_name + 包 + 类加载器。对于像java.lang这样的特殊包名称有一些考虑,但对于org.hibernate.*则不然,如果你要创建自己的jar,它将包含这个相同的包+具有相同名称的注释,效果将是相同的。

换句话说,如果你严格不希望它来自休眠核心,你可以在自己的 jar 中创建自己的@Type注释本身。

希望这会有所帮助。

最新更新