Проблема в том, что
/C:/Users/francois17/Documents/.../create_cam_test.sql
не является URL. Это путь.
Итак, вопрос в том, почему это вызывает эту проблему?
Теперь похоже, что это происходит из-за этого вызова:
RunScript.execute(TestConfig.URL,
TestConfig.USER, TestConfig.PASSWORD, schemaDDL.getFile(), null, false);
или этот
RunScript.execute(TestConfig.URL,
TestConfig.USER, TestConfig.PASSWORD, ddl.getFile(), null, false);
Это выглядит нормально, потому что API для execute ожидает, что 4-й аргумент будет путевым именем.
Тогда я посмотрел на сайт, на котором создается URL. Это в org.h2.store.FileDiskPath::newInputStream
. Код для метода:
public InputStream newInputStream() throws IOException {
if (name.indexOf(':') > 1) {
// if the : is in position 1, a windows file access is assumed: C:.. or D:
if (name.startsWith(CLASSPATH_PREFIX)) {
String fileName = name.substring(CLASSPATH_PREFIX.length());
if (!fileName.startsWith("/")) {
fileName = "/" + fileName;
}
InputStream in = getClass().getResourceAsStream(fileName);
if (in == null) {
Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
}
if (in == null) {
throw new FileNotFoundException("resource " + fileName);
}
return in;
}
// otherwise an URL is assumed
URL url = new URL(name);
InputStream in = url.openStream();
return in;
}
FileInputStream in = new FileInputStream(name);
IOUtils.trace("openFileInputStream", name, in);
return in;
}
Подводя итог, что он делает:
- ищет двоеточие в пути
- Если двоеточие не является вторым символом:
- он ищет URL "classpath:" и обрабатывает его.
- в противном случае, он открывает URL как обычный URL
- Если двоеточия не было или двоеточие было вторым символом (то есть символом диска Windows), он открывает объект в виде файла.
LIGHTBULB!
Посмотрите внимательно на путь сверху. Он выглядит как путь, но на самом деле он искажен. Путь к Windows с диска НЕ ДОЛЖЕН начинаться с «/». Это дополнительное "/" приводит к тому, что двоеточие становится третьим символом, что нарушает логику метода newInputStream
.
Правильный формат для пути с диском следующий:
C:/Users/francois17/Documents/.../create_cam_test.sql
Найдите, откуда появился этот фальшивый ведущий "/", и вы, вероятно, решили свою проблему. Вы также можете обойти фиктивную «/», либо удалив ее, либо добавив «file: //». (Примечание: 2 косые черты ... потому что они уже есть!)