我有一个Java应用程序,需要连接到MySQL。
通过提供url: jdbc:mysql://localhost:3306/<dbname>
,我可以构建Jar。但是,我想在网络中的Docker容器上运行它,在该容器中我还运行着名称为mysqlindocker
的MySQL容器。为了构建Jar,我将URL作为jdbc:mysql://mysqlindocker:3306/<dbname>
放入其中,希望可以在容器内运行。但是我做不到,因为构建失败。我的猜测是,在我的本地计算机上,Spring无法指向该数据库URL。
如何构建URL为jdbc:mysql://mysqlindocker:3306/<dbname>
的jar?
附言我不希望指向在本地主机上运行的MySQL。
最佳答案
I build the jar using mvn clean install. It fails on @Test void contextLoads(). If I comment that out, I am able to build the jar with db url point to my > docker container
在Maven的
test
阶段执行的单元测试框架中,无法解析mysqlindocker
主机名:jdbc:mysql://mysqlindocker:3306/<dbname>
只有在同一docker网络中的容器才能解决该问题。
由于这些测试是在容器外部执行的(确切地说是在启动之前),因此它们无法访问该网络。
如何解决呢?
1)解决根本原因
实际上,在单元测试执行期间构建失败的根本原因是您没有根据目标范围定义jdbc url。
实际上,在Maven构建的
test
阶段,您通常希望测试使用内存数据库或特定的MySQL数据库。出于一致的原因(测试可重复性),您不想使用与主应用程序中使用的相同的一种。在这里,一个好的做法是使用另一个数据库实例进行单元测试,并且应该可以从运行构建的主机(
localhost
)访问该数据库。您可以覆盖已执行测试的
spring.datasource.url
属性:通过在application-test.properties/yml
中定义src/test/resources
文件,或直接在测试类@SpringBootTest(properties=...)
中覆盖该属性。2)解决方法
请注意,如果将MySQL db容器端口发布在执行构建的主机上,则(临时)解决方法是将localhost保留在
spring.datasource.url
中为构建定义的url中,并在运行时使用docker容器名称覆盖它您将JAR作为容器端点运行:java -jar myApp.jar --spring.config.location=jdbc:mysql://mysqlindocker:3306/dbname
关于spring - Java应用程序构建失败,其中Mysql url指向Docker容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60349532/