Hibernate注解只打包问题。

9
2个回答

4

免责声明:我不知道这是否符合hibernate的许可证规定。

您可以将org.hibernate.annotations包提取到最终的jar包中。您将在编译时依赖于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>

Testing:

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

Jar文件内容:

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

2
我不知道是否有一个只包含干净注释(包括@Type)而与Hibernate无关的Hibernate jar。
我猜你想要获取一个jar文件,其中包含使用@Type注释的代码,但不依赖于hibernate-core。
在这种情况下,请使用提供的Maven范围。
谷歌说:
Maven依赖范围-provided。 Maven依赖范围提供了在构建和测试项目期间使用的依赖项。它们也需要运行,但不应导出,因为依赖项将由运行时(例如servlet容器或应用程序服务器)提供。
“必须运行”和“将被提供”的意思是类路径必须加载。
org.hibernate.annotations.Type 

大多数情况下,@Type注解来自已存在的hibernate-core jar包中,但实际上不一定非得是hibernate-core。Java类的坐标是class_name + package + classloader。对于特殊的包名如java.lang有一些考虑因素,但是对于org.hibernate.*而言,如果你创建了自己的jar包,其中包含相同的package和同名的注解,效果将是相同的。

换句话说,如果你严格不想从hibernate-core获取@Type注解,你可以在自己的jar包中创建自己的@Type注解。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接