# Intellij mehrere Programme in einem Projekt bearbeiten



## DerBär (29. Mrz 2021)

Hallo,

gibt es die Möglichkeit mehrere Programme (z.B. eins für einen Taschenrechner, eins für einen Chatclient und eins für ein Testprogramm) innerhalb eines Projekts in Intellij anzuzeigen/zu bearbeiten?

Ich lese grade ein Buch über Javafx in welchem verschiedene Kapitel vorkommen. Ich würde gerne ein Projekt "Javabuch" erstellen und die einzelnen Beispielprogramme aus den verschiedenen Kapiteln z.B. nach Kapiteln sortieren.
Ich kann natürlich einfach Unterordner in Intellij erstellen, aber wie lasse ich mir dann die Projektstruktur (src-main-Java-package-java Files) automatisch erstellen?
Und wie kann ich z.B. für jedes Kapitel dann eine eigene POM.xml etc für Maven anlegen? Die POM.xml muss doch immer im Root Verzeichnis des gesamten Projekts liegen glaube ich?


----------



## kneitzel (29. Mrz 2021)

Du kannst in einem Projekt in IntelliJ so viele einzelne "Programme" haben wie Du willst ...

a) In IntelliJ hast Du in einem Projekt Module. Dies könnte dem entsprechen, was Du als "Programme" bezeichnest.
b) Generell kannst Du in einem Modul auch einfach eine Sammlung an Code haben. Dann startest Du einfach direkt die Klasse, dessen main zu starten willst. Oder Du erstellst mehrere Run Configurations.


----------



## mrBrown (29. Mrz 2021)

Und als Ergänzung: die pom muss im root des jeweiligen Maven-Projekts liegen, dass muss aber nicht das root-Verzeichnis des IntelliJ-Projekts sein. Zusätzlich unterstützt Maven selbst als Multi-Module-Projekte (und diese werden auch von IntelliJ unterstützt), damit kann man Projekte relativ einfach z.B. hierarchisch organisieren.


----------



## kneitzel (29. Mrz 2021)

Ach ... das mit Maven hatte ich ganz überlesen ...

Da sind Multi Module Projekte üblich und die würde ich da generell verwenden. Ich würde da nicht direkt in IntelliJ konfigurieren.
Hintergrund sind diverse Erfahrungen, dass IntelliJ durchaus mal durcheinander kommen kann. In so Situationen lösche ich dann immer gerne alles von IntelliJ  (.idea Oedner, iml Dateien) um dann das Maven Projekt neu in IntelliJ zu öffnen.


----------



## DerBär (30. Mrz 2021)

Vielen Dank schonmal für alle eure Antworten.
Ich habe es nun so gemacht, dass ich in Intellij ein neues leeres Projekt erstelle und über Project Structure die mit Maven erstellten Projekte über die POM.XML als Modul importiere.
Das funktioniert soweit auch gut, aber ein Problem besteht noch. Ich bekomme es nicht hin ein Ressourcen Verzeichnis zu erstellen worin ich .properties Files ablegen kann bzw. generell den classpath wo nach .properties Dateien gesucht werden soll zu ändern.
Die properties Files werden nur gefunden, wenn ich diese in den root des Hauptprojektordners ablege (Sie werden nichtmal gefunden, wenn ich Sie in den Root des jeweiligen Moduls lege wo z.B. auch die jeweilige POM.XML liegt.
Ich habe bereits versucht im Modul root einen ressources Ordner anzulegen, diesen unter Project Strukture->Sources auszuwählen und als Sources/Ressources Verzeichnis zu konfigurieren. Zudem habe ich den Ordner auch schon versucht unter Project Structure-> Dependencys->Add->Jar or Directorys->class zu importieren aber auch so wird die properties File nicht erkannt.
Hat wer eine Idee was ich hier falsch mache?

Zur veranschaulichung. Nur so wird die .properties File gefunden (Multimodules ist mein Idea Projekt, tweetalot mein Importiertes Modul).


----------



## mrBrown (30. Mrz 2021)

Resourcen müssen in src/main/resources des jeweiligen Projekts liegen


----------



## DerBär (30. Mrz 2021)

mrBrown hat gesagt.:


> Resourcen müssen in src/main/resources des jeweiligen Projekts liegen


Der Ordner existiert per default nicht bei mir, wenn ich das Maven Projekt in Intellij als Modul importiere.
Auch wenn ich den Ordner manuell anlege wird die .properties Datei daraus nicht erkannt(Selbst wenn ich ihn unter "Project Structure" als Source oder auch Ressource Folder festlege (Siehe screenshot).


----------



## DerBär (31. Mrz 2021)

Also ich habe inzwischen herausfinden können, dass das Problem immer dann auftritt wenn ich den Javafx Archetype von https://openjfx.io/openjfx-docs/#maven folgenderweise verwende:[CODE lang="java" title="maven archetype"]mvn archetype:generate -DarchetypeGroupId=org.openjfx -DarchetypeArtifactId=javafx-archetype-simple -DarchetypeVersion=0.0.3[/CODE]

 und  das so erstellte Maven Projekt in Intellij importiere . Wenn ich manuell ein Maven Project in Intellij erstelle und das Javafx Plugin sowie die JavaFX und twitter4j dependencys manuell in die POM.xml einbinde funktioniert die Nutzung eines resources Ordners einwandfrei . Einstellungen/POM.xml habe ich bei beiden Projekten verglichen die sind 1:1 . Finde das sehr schade, weil es viel aufwendiger ist alles manuell zu erstellen anstelle den Archetype für Javafx zu verwenden.

Irgendwas muss der Archetype also vorkonfigurieren was die Verwendung eines resource Ordners verhindert.
Im manuell angelegten Project kann ich auch einwandfrei neue ressourcen Ordner anlegen und verwenden da geht alles einwandfrei.


----------



## mrBrown (31. Mrz 2021)

Wie genau lädst du die Resourcen? Das Modulsystem, welches in den per Archetype generierten Projekten genutzt wird, _könnte_ da mit reinspielen.


----------



## DerBär (31. Mrz 2021)

mrBrown hat gesagt.:


> Wie genau lädst du die Resourcen? Das Modulsystem, welches in den per Archetype generierten Projekten genutzt wird, _könnte_ da mit reinspielen.




Also die Module lade ich per Module-Info folgendermaßen:
[CODE lang="java" title="modules-info"]module de.javafxbuch.tweetalot {
    requires javafx.controls;
    requires org.twitter4j.core;
    exports de.javafxbuch.tweetalot;
}[/CODE]

Den manuell angelegten resource Ordner lege ich halt in meinem Modul an und lege diesen über Project Structure->Modulname->Sources als resource Ordner fest.


----------



## mrBrown (31. Mrz 2021)

Ich meinte, wie du innerhalb des Projects auf die Resourcen zugreifst, da gibt’s doch bestimmt irgendwo ein Class#getResource oä?


----------



## DerBär (31. Mrz 2021)

mrBrown hat gesagt.:


> Ich meinte, wie du innerhalb des Projects auf die Resourcen zugreifst, da gibt’s doch bestimmt irgendwo ein Class#getResource oä?


Achso, das macht twitter4j library für mich ich greife da nicht per eigenen Code drauf zu.
Mein Quellcode sieht folgendermaßen aus:
[CODE lang="java" title="source"]package de.javafxbuch.tweetalot;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import twitter4j.*;

/**
* JavaFX App
*/
public class App extends Application {

    @Override
    public void start(Stage stage) {
        StackPane root = new StackPane();
        Label label = new Label();
        root.getChildren().add(label);
        try{
            Twitter twitter = TwitterFactory.getSingleton();
            ResponseList<Status> homeTimeline = twitter.getHomeTimeline();
            label.setText(homeTimeline.get(0).getText());
        }
        catch (TwitterException ex){
            //
        }
        stage.setScene(new Scene(root));
        stage.setTitle("Tweetalot");
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

}[/CODE]

Der Ausgegebene Fehlercode im Projekt wo die twitter4j.properties scheinbar nicht geladen wird sieht folgendermaßen aus:

[CODE lang="java" title="Debug"]"C:\Program Files\Java\jdk-16\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.3\lib\idea_rt.jar=53204:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.3\bin" -Dfile.encoding=UTF-8 -p C:\Users\Marius\IdeaProjects\tweetalot\target\classes;C:\Users\Marius\.m2\repository\org\openjfx\javafx-controls\13\javafx-controls-13.jar;C:\Users\Marius\.m2\repository\org\openjfx\javafx-controls\13\javafx-controls-13-win.jar;C:\Users\Marius\.m2\repository\org\openjfx\javafx-graphics\13\javafx-graphics-13.jar;C:\Users\Marius\.m2\repository\org\openjfx\javafx-graphics\13\javafx-graphics-13-win.jar;C:\Users\Marius\.m2\repository\org\openjfx\javafx-base\13\javafx-base-13.jar;C:\Users\Marius\.m2\repository\org\openjfx\javafx-base\13\javafx-base-13-win.jar;C:\Users\Marius\.m2\repository\org\twitter4j\twitter4j-core\4.0.7\twitter4j-core-4.0.7.jar -m de.javafxbuch.tweetalot/de.javafxbuch.tweetalot.App
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:831)
Caused by: java.lang.IllegalStateException: Authentication credentials are missing. See http://twitter4j.org/en/configuration.html for details. See and register at http://apps.twitter.com/
    at org.twitter4j.core@4.0.7/twitter4j.TwitterBaseImpl.ensureAuthorizationEnabled(TwitterBaseImpl.java:219)
    at org.twitter4j.core@4.0.7/twitter4j.TwitterImpl.get(TwitterImpl.java:2082)
    at org.twitter4j.core@4.0.7/twitter4j.TwitterImpl.getHomeTimeline(TwitterImpl.java:126)
    at de.javafxbuch.tweetalot/de.javafxbuch.tweetalot.App.start(App.java:22)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    ... 1 more
Exception running application de.javafxbuch.tweetalot.App

Process finished with exit code 1
[/CODE]


Und hier noch die POM.XML aus dem Project wo die resource nicht geladen wird (Dem per Archetype erstellten Projekt):
[CODE lang="java" title="POM.xml"]<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>de.javafxbuch</groupId>
    <artifactId>tweetalot</artifactId>
    <version>0.1-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>
        <dependency>
            <groupId>org.twitter4j</groupId>
            <artifactId>twitter4j-core</artifactId>
            <version>[3.0,)</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.3</version>
                <configuration>
                    <mainClass>de.javafxbuch.tweetalot.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>[/CODE]


Und hier noch die .iml aus dem Projekt falls es hilft.
[CODE lang="java" title="tweetalot.iml"]<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
    <output url="file://$MODULE_DIR$/target/classes" />
    <output-test url="file://$MODULE_DIR$/target/test-classes" />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <excludeFolder url="file://$MODULE_DIR$/target" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" name="Maven: org.openjfx:javafx-controls:13" level="project" />
    <orderEntry type="library" name="Maven: org.openjfx:javafx-controls:win:13" level="project" />
    <orderEntry type="library" name="Maven: org.openjfx:javafx-graphics:13" level="project" />
    <orderEntry type="library" name="Maven: org.openjfx:javafx-graphics:win:13" level="project" />
    <orderEntry type="library" name="Maven: org.openjfx:javafx-base:13" level="project" />
    <orderEntry type="library" name="Maven: org.openjfx:javafx-base:win:13" level="project" />
    <orderEntry type="library" name="Maven: org.twitter4j:twitter4j-core:4.0.7" level="project" />
  </component>
</module>[/CODE]


----------



## mrBrown (31. Mrz 2021)

Ahh, ich glaub das klappt mit dem Module-System so nicht.

Damit twitter4j deine Resourcen laden kann, muss das Package exportiert (oder geöffnet?) werden – da die Datei aber im unnamed Package liegt, ist das nicht möglich.


Je nachdem was drin steht, dürfte aber die Variante mit Datei im aktuellen Verzeichnis auch die bessere Wahl sein, das sollte auch problemlos klappen.


----------



## DerBär (31. Mrz 2021)

mrBrown hat gesagt.:


> Ahh, ich glaub das klappt mit dem Module-System so nicht.
> 
> Damit twitter4j deine Resourcen laden kann, muss das Package exportiert (oder geöffnet?) werden – da die Datei aber im unnamed Package liegt, ist das nicht möglich.
> 
> ...



Also im manuell erstellten Projekt wird die .properties Datei aber aus einem selbst erstellten resources Verzeichnis geladen.
Das Problem ist, dass ich in meinem Projekt gerne mehrere Module verwenden möchte, wenn ich aber das Modul tweetalot per JavaFX Archetype konfiguriere wird die Properties Datei ausschließlich geladen wenn ich diese im Projekt root Folder ablege(Ich kann die properties nichtmal in den root Pfad des Moduls tweetalot legen. Somit müsste ich für alle Module jedes .properties File in den Hauptprojektordner "MultiModules Projekt" ablegen. Da muss es doch irgendeine Lösung für geben, wenns im manuell erstellten Projekt auch so geht.


----------



## DerBär (1. Apr 2021)

mrBrown hat gesagt.:


> Ahh, ich glaub das klappt mit dem Module-System so nicht.
> 
> Damit twitter4j deine Resourcen laden kann, muss das Package exportiert (oder geöffnet?) werden – da die Datei aber im unnamed Package liegt, ist das nicht möglich.
> 
> ...



Kann meinen Beitrag leider nicht mehr bearbeiten, könntest du mir vlt. nochmal etwas genauer erklären was es mit dem unnamed Package auf sich hat bzw. wo hier genau das Problem liegt? Habe das leider noch nicht so ganz verstanden, obwohl ich es mal gegoogelt habe.


----------

