簡體   English   中英

VSCode:如何在項目之間共享.java文件

[英]VSCode: how to share .java files between projects

我是 Java 的新手,所以可能會遺漏這里顯而易見的內容。

我想從項目“外部”的文件夾中提取.java文件(不是jars )。 我正在同時開發 MainProject 和 Shared java 文件。 稍后我想在另一個項目中使用共享文件(很可能也作為.java文件,因為另一個項目將與第一個相關 - 即更多並發開發。;-)

我不知道如何使用.java中 SharedJava 文件夾中的 .java 文件。 我已經嘗試過 SO 等中的建議,但無濟於事。

我已經用這樣的文件夾設置了一個新項目:

在此處輸入圖像描述

我在兩個文件夾中創建了 VSCode Java 項目,盡管對於SharedJava我沒有包含任何構建工具。 也許這是一個問題?

這兩個項目都出現在 VSCode 的 JAVA PROJECTS 部分。

展開后,如下所示,作為初始測試,突出顯示的 java 文件是我想導入到 MainProject 中的文件。

在此處輸入圖像描述

SharedClass.java 文件:

package messaging;

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

我要為我的測試做的是在這個 MainProject App.java 文件中:

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? (不創建符號鏈接!)

謝謝,默里

行。 得到它的工作。

首先:我找到的理解 Maven 的最佳解釋(包括多模塊項目的一個很好的例子)在這里: https://books.sonatype.com/mvnex-book/reference/index.html

它已經很舊了,示例代碼將無法運行,因為它引用了不再存在的 API。 但是,解釋非常清楚,示例代碼文件仍然存在作為參考。

也許如果您知道更多同樣好的最新參考資料,您可以在下面發表評論。

對於其他 Java 新手,我提供以下...

最終結果部分是使用 VSCode 功能完成的,部分是手工定制的。 如果我能更好地理解 VSCode java 擴展,也許我可以使用這些擴展來完成這一切。

簡短版本如下,生成的文件和文件夾等進一步顯示。

  1. parent級創建一個新的 Java 項目。 使用 Maven 快速啟動原型。 對於這個示例,我只使用了所有默認值,除了我的 groupId 等。

  2. 保留pom.xml文件並刪除 rest。

  3. 按照下面的示例將<packaging>pom</packaging>添加到pom.xml文件。

  4. parent項目中,使用與父項目相同的 groupId 創建shared項目。 當詢問時,將項目添加到工作區。 如果需要,請刪除App.java文件。

  5. shared的 pom.xml 中,我刪除了<groupId>部分。 請注意,Maven 包含<parent>塊。

  6. parent項目中,使用與父項目相同的 groupId 創建mainapp項目。 當詢問時,將項目添加到工作區。

  7. mainapp pom.xml 中,我刪除了<groupId>部分。 請注意,Maven 包含<parent>塊。

  8. mainapp pom.xml 中,為shared項目添加一個<dependency>塊,如下例所示。

  9. 如果你 go 回到parent項目的pom.xml ,並滾動到最后,你應該看到 VSCode 添加了一個這樣的塊:

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

您可以將其移至頂部以使其更顯眼。

  1. 將您的測試 class(例如 PrintMessage.java)添加到您的shared項目的自己的文件夾中(例如消息傳遞)。
  2. 根據示例更新您的mainapp App.java文件以包含您共享的 class。
  3. 從父項目根運行mvn clean install 這會將 jars 添加到本地 Maven 存儲庫(本地存儲庫的位置與終端輸出中打印的一樣)。

此時,我發現我需要關閉並重新打開 VSCode window,以便 Java 項目部分自行整理,3 個項目出現在那里。 如果我不這樣做,我會得到“類路徑”錯誤。

然后,我可以通過打開App.java文件並使用 VSCode Run java來進行測試。 終端顯示:

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

我注意到如果我編輯PrintMessage.java文件(例如更改 output 消息),我可以運行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

<?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);
    }
}

我希望能有所幫助,歡迎任何有關構建應用程序的專家建議。

Go 嗯,默里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM