VSCode:如何在项目之间共享.java文件

ohtdti5x  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(224)

我是Java新手,所以可能错过了这里显而易见的东西。
我想从项目"外部"的文件夹中取出.java文件(不是jars)。我同时开发主项目和共享java文件。稍后我想在另一个项目中使用共享文件(很可能也是.java文件,因为另一个项目将与第一个项目相关-即更多的并发开发。-)
我不知道如何使用主项目中SharedJava文件夹中的.java文件。我已经尝试了SO等中的建议,但没有效果。
我已经建立了一个新项目,文件夹如下:

我已经在两个文件夹中创建了VSCode Java项目,尽管对于SharedJava我没有包含任何构建工具。
这两个项目都出现在VSCode的JAVA PROJECTS节中。
展开后,如下所示,作为初始测试,突出显示的java文件是我想要导入到MainProject中的文件。

The SharedClass.java file:

package messaging;

public class SharedClass {
  public void echoMessage(String msg) {
    System.out.println("SharedClass.echoMessage() said: " + msg);
  }
}

and what I am trying to do for my test is in this MainProject App.java file:

package com.flowt;

public class App {
    public static void main( String[] args ) {
        System.out.println( "Hello World!" );

        // How to import SharedClass ?
        SharedClass sharedClass = new SharedClass();
        sharedClass.echoMessage("Hello XYZ");
    }
}

我的MainProject.code-workspace文件是这样的:

{
    "folders": [
        {
            "path": "."
        },
        {
            "path": "../SharedJava/flowtshared"
        }
    ],
    "settings": {
        "java.project.sourcePaths": [
            "src",
            "../SharedJava/flowtshared/src"
        ]
    }
}

那么,我需要做些什么才能将SharedClass.java导入到MainProject中呢?(不创建符号链接!)
谢谢,默里

kx7yvsdv

kx7yvsdv1#

好的。修好了。
首先:我发现理解Maven的最佳解释(其中包括一个多模块项目的好例子)如下:https://books.sonatype.com/mvnex-book/reference/index.html
它相当旧,示例代码不能工作,因为它引用了不再存在的API。但是,解释非常清楚,示例代码文件仍然作为参考存在。
也许如果你知道更多最新的参考资料是一样好,你可以把下面的评论。
对于其他Java新手,我提供以下内容...
最终的结果是部分使用VSCode功能和部分手动定制完成的。如果我更好地理解VSCode Java扩展,也许我可以使用扩展完成这一切。
简短的版本如下所示,产生的文件和文件夹等显示进一步下降。
1.为parent创建一个新的Java项目,使用Maven快速入门原型,对于这个示例,我使用了所有默认值,除了groupId等。
1.保留pom.xml文件并删除其余文件。
1.按照以下示例将<packaging>pom</packaging>添加到pom.xml文件。
1.在parent项目中,使用与父项目相同的groupId创建shared项目。当系统询问时,将项目添加到工作区。如果愿意,删除App.java文件。
1.在shared pom.xml中,我删除了<groupId>部分,注意Maven包含了<parent>块。
1.在parent项目中,使用与父项目相同的groupId创建mainapp项目,当系统询问时,将该项目添加到工作区。
1.在mainapp pom.xml中,我删除了<groupId>部分,注意Maven包含了<parent>块。
1.在mainapp pom.xml中,为shared项目添加一个<dependency>块,如下例所示。
1.如果您返回到parent项目的pom.xml,并滚动到末尾,您应该看到VSCode添加了一个如下所示的块:

<modules>
  <module>shared</module>
  <module>mainapp</module>
</modules>

您可以将其移到顶部以使其更明显。
1.将您的测试类(例如PrintMessage.java)添加到您的shared项目中,放在它自己的文件夹中(例如messaging)。
1.更新您的mainappApp.java文件,以按照示例包含您的共享类。
1.从父项目根目录运行mvn clean install,这会将jar添加到本地Maven存储库(本地存储库的位置如终端输出所示)。
这时我发现我需要关闭并重新打开VSCode窗口,这样Java项目部分就会自动排序,3个项目就会出现在那里。如果我不这样做,就会出现“类路径”错误。
然后,我可以打开App.java文件并使用VSCode对Run java进行测试。

Hello World!
PrintMessage.echoMessage() echoed: I was called from Main app

我注意到如果我编辑PrintMessage.java文件(例如改变输出消息),我可以运行App.java文件而不需要重新编译,改变就会显示出来。酷。
====代码示例====
(为了清楚起见,我删除了src/testtarget文件夹)

parent pom.xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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>

  <name>The Parent project for my test multi modules</name>

  <groupId>com.flowt.multitest</groupId>
  <artifactId>parent</artifactId>
  <version>1.0.0-SNAPSHOT</version>

  <packaging>pom</packaging>

  <modules>
    <module>shared</module>
    <module>mainapp</module>
  </modules>

  <dependencies>

    <!-- The rest of this file is as normal ... -->

shared pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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>

  <!-- Refer to the parent pom.xml -->
  <parent>
    <groupId>com.flowt.multitest</groupId>
    <artifactId>parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <!--
    Since we have a parent we leave this out
    because it is pulled from the parent pom.xml

    <groupId>com.flowt.shared</groupId>
  -->
  <artifactId>shared</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <!-- The rest of this file is as normal ... -->

mainapp pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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>

  <!-- Refer to the parent pom.xml -->
  <parent>
    <groupId>com.flowt.multitest</groupId>
    <artifactId>parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <artifactId>mainapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>
      1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- Here you must include the shared project as a dependency -->
    <dependency>
      <groupId>com.flowt.multitest</groupId>
      <artifactId>shared</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

  </dependencies>

  <!-- The rest of this file is as normal ... -->

PrintMessage.java

package com.flowt.messaging;

public class PrintMessage {
  public String echoMessage(String msg) {
    return "PrintMessage.echoMessage() echoed: " + msg;
  }
}

App.java

package com.flowt.app;

// This class is in the shared project: shared/src/main/java/com/flowt/messaging/PrintMessage.java
import com.flowt.messaging.PrintMessage;

/**
 * Hello world!
 */
public class App {
    public static void main( String[] args ) {
        System.out.println( "Hello World!" );

        // The shared class
        PrintMessage printMessage= new PrintMessage();
        String echo = printMessage.echoMessage("I was called from Main app");
        System.out.println(echo);
    }
}

我希望这能有所帮助,任何关于构建应用程序的Maven建议都是最受欢迎的。
祝你好运,默里

相关问题