我在Intellij Idea中创建了一个小项目,以模仿我所看到的试图将大型遗留代码库迁移到OPENJDK16的情况。目录结构如下:
$ tree
/cygdrive/c/projects/play
|--api
|----api.iml
|----src
|------module-info.java (module com.company.feature.apimodule)
|------com
|--------company
|----------feature
|------------ApiRunnable.java
|--home
|----home.iml
|----src
|------module-info.java (module com.company.feature.homemodule)
|------com
|--------company
|----------feature
|------------Runnable1.java
|--Modules
|----.idea (Idea stuff in here)
|----out
|------production
|--------api
|--------home
module com.company.feature.apimodule
{
exports com.company.feature;
}
package com.company.feature;
public interface ApiRunnable
{
public void play(String[] strings);
}
module com.company.feature.homemodule
{
requires com.company.feature.apimodule; //Error Module not found
// requires apimodule; //Error Module not found
// requires com.company.feature.ApiRunnable; //Error Module not found
}
package com.company.feature;
public class Runnable1 implements ApiRunnable
{
@Override
public void play(String[] strings)
{
int count = 1;
for (String str : strings)
{
System.out.println("String " + count++ + " " + str);
}
}
public static void main(String[] args)
{
Runnable1 myRun = new Runnable1();
myRun.play(args);
}
}
注意api和home中的目录结构是相同的。这是有意为之,因为我的遗留代码库具有这种结构。这个小例子似乎重复的问题,我有,我不知道如果结构是问题。它编译和运行使用unnamed-module好。
重新编译时错误#1
C:ProjectsplayhomesrccomcompanyfeatureRunnable1.java
java: package exists in another module: com.company.feature.apimodule
这是否意味着我不能在api和home中拥有相同的包树?
错误# 2
homemodule看不到apimodule,我一直得到(Module not found),不管我在require行中放了什么。
这与错误#1有关吗?如果没有,我如何解决这个问题,而不诉诸于未命名的模块的一切?
通过将module-info.java放到正确的目录中解决了这个问题。这是缺乏记录的,是通过反复试验发现的。正确的目录是api:
module apimodule
{
exports com.company.feature;
}
和家庭:
module homemodule
{
requires apimodule;
}
看起来,一旦module-info.java文件就位,Runnable1.java就不需要import语句了,因为导入的包和本地包是一样的。
@foo你是正确的。真正的解决方案是不允许在不同的模块中使用重复的包名。这不是一个好的编码实践,但是,嘿,我继承了它,这个解决方案迫使我清理它。
我解决了这个问题通过重命名5包独特的名字和更新数以百计的导入语句。虽然乏味,但这是一项相对不需要动脑筋的工作。
由于模块识别它们的src
目录中的东西,它们不知道被引用的是哪个包,是api.src
还是home.src
中的那个。
我应该回来更新这个问题,所以再次感谢@foo提醒我。