Java IntelliJ can';找不到通过新模块功能导入的包,然后自动删除导入语句?

Java IntelliJ can';找不到通过新模块功能导入的包,然后自动删除导入语句?,java,intellij-idea,groovy,import,Java,Intellij Idea,Groovy,Import,我是IntelliJ项目的新手。以下是我的IntelliJ版本信息: IntelliJ IDEA 2017.2.1 Build #IU-172.3544.35, built on July 31, 2017 Subscription is active until April 3, 2018 JRE: 1.8.0_152-release-915-b6 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o Linux 3.13.0-128-g

我是IntelliJ项目的新手。以下是我的IntelliJ版本信息:

IntelliJ IDEA 2017.2.1
Build #IU-172.3544.35, built on July 31, 2017
Subscription is active until April 3, 2018
JRE: 1.8.0_152-release-915-b6 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 3.13.0-128-generic
我正在运行Linux Ubuntu 14.04

我有两个完全不同的项目。我想将驻留在JAR文件中的代码从第一个项目导入第二个项目

我尝试使用“newmodule->Import from existing sources”选项,并将整个第一个项目添加到第二个项目的源结构中。但我仍然无法将第一个项目成功使用的JAR文件中的类导入到第二个项目中。当我尝试时,IntelliJ给了我“无法解析符号”错误。更令人恼火的是,经过一定的时间后,或者当我试图编译项目时,它会自动删除导入语句。(这是“自动删除未使用的导入”功能在这里咬我吗?)

例如,在第一个项目中可以找到以下导入语句,IntelliJ认为该语句有效(无警告或错误):

但是,当我在第二个项目中尝试在文件中使用相同的导入时,我得到的错误是“无法解析符号”“Messenger 4j,导入语句在某个点自动删除。注意,我尝试在其中使用import语句的文件是驻留在第二个项目中的groovy源文件,以防万一

另外,如果我查看IntelliJ在“~/.m2”目录中维护的repo存储库,我确实看到了JAR文件。在这里,您可以看到我可以成功地将“.m2”存储库树导航到Messenger 4J包:

/home/user9/.m2/repository/com/github/messenger4j$
如何在第二个项目中正确导入和使用github.com.messenger4jjar文件

更新:通过以下命令,我可以访问驻留在“~/.m2”目录中的所需JAR:

File -> 
Project Structure -> 
Dependencies (tab) -> 
"+" sign in right hand border ->
Library
然后我在库列表中看到JAR文件,通过添加它,我不再得到未解决的符号错误这是使用IntelliJ/Maven使用外部JAR文件的正确方法吗?

这是使用IntelliJ/Maven使用外部JAR文件的正确方法吗

不,这不是马文的方式

如果两个项目都使用Maven,那么它们都有一个POM文件来定义一些东西。假设您有以下设置:

项目A

<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>projectA</artifactId>
  <version>1.0-SNAPSHOT</version>

</project>

4.0.0
com.example
项目A
1.0-快照
项目B

<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>projectB</artifactId>
  <version>1.0-SNAPSHOT</version>

</project>

4.0.0
com.example
项目B
1.0-快照
如果要在项目B中使用项目A中的类,则需要将项目A添加为项目B的依赖项。将项目B的POM文件更改为:

<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>projectB</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>projectA</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

</project>

4.0.0
com.example
项目B
1.0-快照
com.example
项目A
1.0-快照
但这不是唯一的事情。为了让项目B使用项目A,Maven需要知道在哪里可以找到它。通过在项目A的根目录中运行
mvn clean install
命令,在本地Maven存储库中安装项目A,可以解决这个问题

之后,IntelliJ的Maven将能够找到依赖项,而无需手动导入项目A

这是使用IntelliJ/Maven使用外部JAR文件的正确方法吗

不,这不是马文的方式

如果两个项目都使用Maven,那么它们都有一个POM文件来定义一些东西。假设您有以下设置:

项目A

<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>projectA</artifactId>
  <version>1.0-SNAPSHOT</version>

</project>

4.0.0
com.example
项目A
1.0-快照
项目B

<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>projectB</artifactId>
  <version>1.0-SNAPSHOT</version>

</project>

4.0.0
com.example
项目B
1.0-快照
如果要在项目B中使用项目A中的类,则需要将项目A添加为项目B的依赖项。将项目B的POM文件更改为:

<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>projectB</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>projectA</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

</project>

4.0.0
com.example
项目B
1.0-快照
com.example
项目A
1.0-快照
但这不是唯一的事情。为了让项目B使用项目A,Maven需要知道在哪里可以找到它。通过在项目A的根目录中运行
mvn clean install
命令,在本地Maven存储库中安装项目A,可以解决这个问题


之后,IntelliJ的Maven将能够找到依赖项,而无需手动导入项目A。

文件->项目结构->依赖项->选择依赖项并将其从“运行时”更改为“编译”

文件->项目结构->依赖项->选择依赖项并将其从“运行时”更改为“编译”

当然,您可以随时手动导入jar,但我认为使用maven更好。当然,您可以随时手动导入jar,但我认为使用maven更好。谢谢。你会用IntelliJ这样做吗?还是有一个IntelliJ IDE功能可以做几乎相同的事情?@RobertOschler这是一种方式,是的。Maven集成在IntelliJ中是单向的。您可以使用IntelliJ添加库,但它们永远不会写入POM文件。你需要自己做,谢谢。有没有给格雷德尔的建议?项目A是Maven,而需要访问项目A中的JAR的项目B是Gradle。这是我在工作中继承的情况。我知道你也可以使用Maven本地存储库来存储Gradle。谢谢。你会用IntelliJ这样做吗?还是有一个IntelliJ IDE功能可以做几乎相同的事情?@RobertOschler这是一种方式,是的。Maven集成在IntelliJ中是单向的。您可以使用IntelliJ添加库,但它们永远不会写入POM文件。你需要自己做,谢谢。有没有给格雷德尔的建议?项目A是Maven,而需要访问项目A中的JAR的项目B是Gradle。这是我在工作中继承的情况,我知道你也可以使用Maven本地存储库来存储Gradle。