错误:包存在于另一个模块中:Intellij中的com.company. function .apimodule.<



我在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提醒我。

相关内容

  • 没有找到相关文章