【问题标题】:How to specify a relative file path in a standard Maven project如何在标准 Maven 项目中指定相对文件路径
【发布时间】:2016-03-14 20:31:43
【问题描述】:

我的 Maven 项目需要加载数据到数据库,import.sql 包含以下内容:

LOAD DATA LOCAL INFILE 
`'/home/jack/ubuntu/bword/src/main/resources/Term.txt' INTO TABLE Term FIELDS TERMINATED BY '\t'  LINES TERMINATED BY '\n' (id,name);`

这里使用的路径是我机器上的绝对路径。如何指定相对路径以使其工作?我试过这些:

/bword/src/main/resources/Term.txt
../bword/src/main/resources/Term.txt
../bword/src/main/resources/Term.txt
../src/main/resources/Term.txt

这些都不起作用。该文件位于 Maven 目录中的默认目录 src/main/resources

我正在使用 JBoss 和休眠,JPA。

【问题讨论】:

  • 什么在消耗这个文件?一个 Maven 插件(哪个?)一个 Java 主插件?测试?
  • 其实我也不是很清楚。我认为它被 Java Persistence API 和 Hibernate 使用,因为我使用这些 API 来访问 mysql 数据库。按照约定,import.sql 会在 Web 应用启动时自动执行,Hibernate 会创建数据库并填充数据。
  • 好的,那么文件将被你的应用程序使用,而不是被Maven使用,不会有src/main/resources的概念,你可以删除它,然后用/Term.txt试试(意思是:在类路径的根)
  • HHH000388:不成功:将数据本地 INFILE '/Term.txt' 加载到由 '\t' 行终止的表项字段中,这些行由 '\n' (id,name) 终止。无法发送文件:/Term.txt(没有这样的文件或目录)
  • 那么简单的Term.txt呢? (我不喜欢这种尝试游戏,但根据给定的信息,总是值得一试)

标签: java maven


【解决方案1】:

恕我直言,你做不到。

您的应用程序是网络应用程序(我看看聊天)。 Maven 可以将import.sqlTerm.txt 打包到应用程序中。这两个文件都在类路径中可见。 Hibernate 扫描类路径,找到import.sql 并执行它。

但是当import.sql继续执行时,命令

LOAD DATA LOCAL INFILE 'file_name' ...

被执行。 'file_name' 针对当前工作目录解决。

  1. Term.txt 在文件系统中是否可见?我不这么认为。
  2. 您的应用程序是否控制 JBoss 进程的当前目录?没有

总结:

  1. Term.txt 在 JBoss 文件系统中不作为文件可见
  2. LOAD DATA LOCAL INFILE 需要 JBoss 文件系统上的文件

【讨论】:

  • "LOAD DATA LOCAL INFILE 需要 JBoss 文件系统上的文件",可以这样做吗?
  • 这不是很常见的场景,还是很少有人用这种方式通过 Hibernate 加载数据到数据库?
  • Hibernate 的主要目的是提供 JPA 映射。 import.sql 是附加组件 - 有用但不是核心功能。由于幂等性,加载数据库并非易事。 Flywaydb 是填充数据库的工具之一。其他简单的解决方案是将Term.txt转换成很多sql插入命令,写入文件并通过Hibernate执行文件(hibernate可以在启动时加载很多文件:stackoverflow.com/a/27709692/2365727
猜你喜欢
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多