Java 9测试路径报错:cannot find symbol及Maven项目结构求助
Alright, let's figure out why you're getting that annoying "cannot find symbol" error in your Java 9 modular Maven project, and walk through how to fix it step by step.
1. Module Export/Dependency Issues for Test Code
Java 9's module system enforces strict encapsulation, so even if your shared module exports its main package, test-specific classes (like TestBase or TestDataContainer) might not be accessible to your implementation modules' test code.
Fixes:
- Add a test module descriptor to
shared: Create amodule-info.javainshared/src/test/javato explicitly export test packages and allow access to other test modules:module org.project.shared { // Export main package for production code exports org.project.shared; // Export test package to your implementation modules' test code exports org.project.shared to org.project.implementationClientA.test, org.project.implementationClientB.test; // Declare required modules (java.base is implicit, but add others if needed) requires junit; // If your tests use JUnit } - Adjust the main module descriptor: If your test code relies on internal packages of
shared, updateshared/src/main/java/module-info.javato open or export those packages to your implementation modules:module org.project.shared { exports org.project.shared; // Allow implementation modules to access test-related packages exports org.project.shared to org.project.implementationClientA, org.project.implementationClientB; // Use 'opens' if you need reflective access (e.g., for testing frameworks) opens org.project.shared to org.project.implementationClientA.test; }
2. Missing Maven Test Dependencies
By default, Maven only includes production code from dependencies in your build. To access shared's test classes in your implementation modules, you need to explicitly depend on shared's test JAR.
Fixes:
- Configure
sharedto build a test JAR: Add this toshared/pom.xmlto generate a JAR containing test classes:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <goals> <goal>test-jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build> - Add test dependency in implementation modules: Update
implementationClientA/pom.xml(andB's) to include the test JAR dependency:<dependencies> <!-- Production dependency on shared --> <dependency> <groupId>your.group.id</groupId> <artifactId>shared</artifactId> <version>your-project-version</version> <scope>compile</scope> </dependency> <!-- Test dependency on shared's test classes --> <dependency> <groupId>your.group.id</groupId> <artifactId>shared</artifactId> <version>your-project-version</version> <scope>test</scope> <type>test-jar</type> </dependency> </dependencies>
3. Outdated or Misconfigured Surefire Plugin
Maven's Surefire plugin needs to be compatible with Java 9 modules to properly resolve test dependencies and module paths.
Fix:
Update and configure the Surefire plugin in all modules' pom.xml (or your parent pom):
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <!-- Use a version that supports Java 9+ --> <configuration> <useModulePath>true</useModulePath> <!-- Ensure the plugin uses the module path --> </configuration> </plugin> </plugins> </build>
4. Missing Test Module Descriptors
If your implementation modules' test directories don't have a module-info.java, Maven might treat them as automatic modules, leading to dependency resolution issues.
Fix:
Add a module-info.java in implementationClientA/src/test/java (and B's) to declare dependencies on shared and other required modules:
module org.project.implementationClientA.test { requires org.project.shared; requires org.project.implementationClientA; requires junit; // Add other test framework dependencies here }
内容的提问来源于stack exchange,提问作者jahuer1

