我有一个项目来编译 Java 源代码并使用 JUnit 对其进行测试。项目本身是用 Spring Boot 编写的,并作为服务器运行。一般来说,我使用编译器编译javac并告诉它通过-cp最多两个库的路径(因为它正在JUnit被测试,它需要junit.jar和hamcrest.jar)。最终结果类似于javac -cp ../junit.jar;../hamcrest.jar className testClassName. 这个东西在本地计算机上工作,但是当在 Docker 中启动时,它当然停止工作,因为它也找不到文件junit.jar,hamcrest.jar所以在我将它们设为外部的帮助volumes下docker-compose.yml,他又开始看到它们(使用 Java 代码,我制作了一个查看文件夹内容的代码并在 Docker 中运行它,结果是compileta | 2021-05-11 13:08:51.418 INFO 1 --- [nio-8081-exec-1] r.d.c.u.CompiletaClassLoaderComponent : [modules/hamcrest.jar, modules/junit.jar] ) - 也就是说,它看到了这两个文件,但由于某种神奇的原因javac,它仍然无法编译,并且它javac可以自行工作(我尝试在没有依赖的情况下进行编译JUnit,一切都很好),所以问题出在这些库中。
总的来说,任务不是很琐碎,所以我不太了解程序代码或文件究竟需要带来什么——所以在评论中提问,我会及时编辑并添加你需要的内容。
最后的命令看起来像这样
javac -cp modules/junit.jar;modules/hamcrest.jar /classes/f8809fab-cf93-4fe6-890b-2dffd16dd69c/Upper.java /classes/f8809
fab-cf93-4fe6-890b-2dffd16dd69c/SolutionTest.java
本地计算机上的命令如下所示:
javac -cp modules/junit.jar;modules/hamcrest.jar src/main/resources/classes/9f70eb8c-1391-4c57-b38f-aeaa299c5aad/Upper.java src/main/resources/classes/9f70eb8c-1391-4c57-b38f-aeaa299c5aad/SolutionTest.java
码头工人-compose.yml
version: '3.7'
services:
db:
image: postgres
container_name: postgres
ports:
- 5432:5432
environment:
POSTGRES_USERNAME: postgres
POSTGRES_PASSWORD: 1234
POSTGRES_DB: dexterity
compileta:
container_name: compileta
image: compileta
command: java -jar compileta.jar --spring.profiles.active=dev
ports:
- 8081:8081
volumes:
- ./modules:/modules/
- ./clasess:/classes/
environment:
SERVER_PORT: 8081
COMPILE_CLASSESDIRECTORY: /classes/
COMPILE_MODULESDIRECTORY: /modules/
app:
build: .
container_name: dexterity
ports:
- 8080:8080
command: java -jar dexterity.jar --spring.profiles.active=dev
volumes:
- ./res/images:/avatars/
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/dexterity
SPRING_DATASOURCE_USERNAME: postgres
SPRING_DATASOURCE_PASSWORD: 1234
COMPILETA_COMPILEURL: http://compileta:8081/compile
COMPILETA_COMPILALLURL: http://compileta:8081/compile_all
UPLOAD_IMAGESPATH: /avatars/
links:
- db
- compileta
出现以下错误:
compileta | 2021-05-11 15:00:43.595 INFO 1 --- [nio-8081-exec-1] r.d.c.u.CompiletaClassLoaderComponent : javac -cp /modules/junit.jar;/modules/hamcrest.jar /classes/2cd76dd5-aaf3-482b-a9d4-d6d187e1c094/Upper.java /classes/2cd
76dd5-aaf3-482b-a9d4-d6d187e1c094/SolutionTest.java
compileta | 2021-05-11 15:00:43.597 INFO 1 --- [nio-8081-exec-1] r.d.c.u.CompiletaClassLoaderComponent : [/modules/hamcrest.jar, /modules/junit.jar]
compileta | 2021-05-11 15:00:44.260 INFO 1 --- [nio-8081-exec-1] r.d.c.u.CompiletaClassLoaderComponent : /classes/2cd76dd5-aaf3-482b-a9d4-d6d187e1c094/SolutionTest.java:1: error: package org.junit does not exist
compileta | import org.junit.Test; import static org.junit.Assert.assertEquals; import org.junit.runners.JUnit4;
compileta | ^
compileta | /classes/2cd76dd5-aaf3-482b-a9d4-d6d187e1c094/SolutionTest.java:1: error: package org.junit does not exist
compileta | import org.junit.Test; import static org.junit.Assert.assertEquals; import org.junit.runners.JUnit4;
compileta | ^
compileta | /classes/2cd76dd5-aaf3-482b-a9d4-d6d187e1c094/SolutionTest.java:1: error: static import only from classes and interfaces
compileta | import org.junit.Test; import static org.junit.Assert.assertEquals; import org.junit.runners.JUnit4;
compileta | ^
compileta | /classes/2cd76dd5-aaf3-482b-a9d4-d6d187e1c094/SolutionTest.java:1: error: package org.junit.runners does not exist
compileta | import org.junit.Test; import static org.junit.Assert.assertEquals; import org.junit.runners.JUnit4;
compileta | ^
compileta | /classes/2cd76dd5-aaf3-482b-a9d4-d6d187e1c094/SolutionTest.java:4: error: cannot find symbol
compileta | @Test public void testSomething() { assertEquals("HELLO",u.MakeUpperCase("hello")); } }
compileta | ^
compileta | symbol: class Test
compileta | location: class SolutionTest
compileta | /classes/2cd76dd5-aaf3-482b-a9d4-d6d187e1c094/SolutionTest.java:4: error: cannot find symbol
compileta | @Test public void testSomething() { assertEquals("HELLO",u.MakeUpperCase("hello")); } }
compileta | ^
compileta | symbol: method assertEquals(String,String)
compileta | location: class SolutionTest
compileta | 6 errors
PS目录modules包含这两个库
问题是
classpathjavac 的参数格式取决于系统。;即,Windows -和 linux -中类路径组件的路径之间的分隔符:。Docker 使用 Linux,命令应该是这样的(注意参数中的冒号
-cp):生成命令时使用File.pathSeparatorChar以便它可以跨系统移植。
这会导致 javac 误解类路径并且找不到库。