gpt4 book ai didi

java - 在我的测试中遇到 MalformedURLException 但以前从未发生过

转载 作者:行者123 更新时间:2023-12-02 11:16:48 28 4
gpt4 key购买 nike

我将 Windows 从 7 升级到 10,现在在我的项目中,我在运行测试时遇到了这些异常。

这是我的代码

    @BeforeClass
public static void createSchema() throws Exception {

log.info("Creating H2 CA_MANAGER schema");

URL schemaDDL = Thread.currentThread().getContextClassLoader().getResource("create_cam_test.sql");
RunScript.execute(TestConfig.URL,
TestConfig.USER, TestConfig.PASSWORD, schemaDDL.getFile(), null, false);

log.info("Running H2 CA_MANAGER DDL");

URL ddl = Thread.currentThread().getContextClassLoader().getResource("ca_manager3_ddl_h2.sql");
RunScript.execute(TestConfig.URL,
TestConfig.USER, TestConfig.PASSWORD, ddl.getFile(), null, false);
}

这是一个异常(exception)。

 org.h2.message.DbException: IO Exception: "java.net.MalformedURLException: no protocol: /C:/Users/Documents/camanager-combined/camanager.persistence.hibernate/target/test-classes/create_cam_test.sql"; "/C:/Users/Documents/camanager-combined/camanager.persistence.hibernate/target/test-classes/create_cam_test.sql" [90031-196]

at org.h2.message.DbException.get(DbException.java:168)
at org.h2.message.DbException.convertIOException(DbException.java:330)
at org.h2.tools.RunScript.process(RunScript.java:334)
at org.h2.tools.RunScript.execute(RunScript.java:304)
at
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.h2.jdbc.JdbcSQLException: IO Exception: "java.net.MalformedURLException: no protocol: /C:/Users/Documents/camanager-combined/camanager.persistence.hibernate/target/test-classes/create_cam_test.sql"; "/C:/Users/Documents/camanager-combined/camanager.persistence.hibernate/target/test-classes/create_cam_test.sql" [90031-196]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
... 27 more
Caused by: java.net.MalformedURLException: no protocol: /C:/Users/Documents/camanager-combined/camanager.persistence.hibernate/target/test-classes/create_cam_test.sql
at java.net.URL.<init>(URL.java:593)
at java.net.URL.<init>(URL.java:490)
at java.net.URL.<init>(URL.java:439)
at org.h2.store.fs.FilePathDisk.newInputStream(FilePathDisk.java:317)
at org.h2.store.fs.FileUtils.newInputStream(FileUtils.java:218)
at org.h2.tools.RunScript.process(RunScript.java:186)
at org.h2.tools.RunScript.process(RunScript.java:329)
... 24 more

当我想执行脚本时发生异常。变量 schemaDDL.getFile() 返回与异常中看到的路径完全相同的路径:

/C:/Users/Documents/camanager-combined/camanager.persistence.hibernate/target/test-classes/create_cam_test.sql

我也查了一下,确实有。我还找到了指出需要将 file:// 附加到路径的解决方案,我这样做了,但仍然出现相同的异常。文件路径如下所示

file://C:/Users/Documents/camanager-combined/camanager.persistence.hibernate/target/test-classes/create_cam_test.sql

异常如下所示

org.h2.jdbc.JdbcSQLException: IO Exception: "java.net.MalformedURLException: no protocol: //C:/Users/Documents/camanager-combined/camanager.persistence.hibernate/target/test-classes/create_cam_test.sql"; "file://C:/Users/Documents/camanager-combined/camanager.persistence.hibernate/target/test-classes/create_cam_test.sql" [90031-196]

我使用的Java版本是Java 1.8.0_121。你有什么解决办法。

最佳答案

问题在于

/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 期望第四个参数是路径名。

然后我查看了正在创建 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;
}

总结一下它的作用:

  1. 它在路径名中查找冒号
  2. 如果冒号不是第二个字符:
    1. 它会查找“classpath:”URL 并对其进行处理。
    2. 否则,它将作为普通 URL 打开该 URL
  3. 如果没有冒号,或者冒号是第二个字符(即 Windows 驱动器字符),则会将对象作为文件打开。

灯泡!

仔细查看上面的路径名。它看起来像一个路径名,但实际上它的格式是错误的。带有驱动器的 Windows 路径名不应以“/”开头。额外的“/”导致冒号成为第三个字符,这破坏了 newInputStream 方法的逻辑。

带有驱动器的路径名的正确格式是这样的:

C:/Users/francois17/Documents/.../create_cam_test.sql

找到那个假的前导“/”来自哪里,你可能已经解决了你的问题。您还可以通过删除假“/”或在前面添加“file://”来解决它。 (注意:2 个斜杠...因为已经有一个斜杠了!)

关于java - 在我的测试中遇到 MalformedURLException 但以前从未发生过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50211641/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com