Zweite Main-Methode zuschalten

Encera

Aktives Mitglied
Hallo zusammen,
ich habe wieder mal ein kleines Problem bezüglich meines Buchs zum Thema Blockchain Entwicklung, wobei meine Frage diesesmal etwas trivialer ist - denke ich zumindest.

Und zwar habe ich das nächste Kapitel abgeschlossen in dem es darum geht die Blockchain um den Faktor Dezentralität zu erweitern, sprich es sollte nun möglich sein dass sich mehrere Knoten mit dieser verbinden. Dazu heißt es im Buch man soll sich eine zweite Main-Methode anlegen und in dieser einfach den Port des Tomcats abändern und beide starten. Im Buch wird das ganze nur kurz folgendermaßen beschrieben:

IMG_20220816_060724.jpg
Ich hab die zweite Main-Methode bereits erstellt und versucht beide über Eclipse zu starten. Das hat auch mehr oder weniger funktioniert, hab mir dafür eine zweite Konsole eingeblendet und auf Konsole 1 die erste Main ausgeführt und auf Konsole 2 die zweite nur ist erfolgte nicht die im Buch zu sehende Ausgabe. Ich bin mir aber nicht sicher ob die das ganze nicht über die Eingebaaufforderung gestartet haben und nicht über Eclipse, zumindest sieht es auf dem Bild etwas danach aus, was meint ihr?
Hier mal der Code der Main:
Java:
public class StartSecond {

    public static void main(String[] args) {
        try
        {
            Tomcat tomcat = new Tomcat( );

            String webappDirectory = new File( "src/main/webapp" ).getAbsolutePath( );

            tomcat.setPort( 8081 );

            Context context = tomcat.addWebapp( "", webappDirectory );

            Tomcat.addServlet( context, "blockchain", new ServletContainer( new Application( ) ) );
            context.addServletMappingDecoded( "/blockchain/api/*", "blockchain" );

            tomcat.start( );
            tomcat.getServer( ).await( );
        }
        catch ( Exception e )
        {
            e.printStackTrace( );
        }
    }

    

}

PS: Die erste Main-Methode ist identtisch nur der Port wäre 8080
 

httpdigest

Top Contributor
Ich bin mir aber nicht sicher ob die das ganze nicht über die Eingebaaufforderung gestartet haben und nicht über Eclipse, zumindest sieht es auf dem Bild etwas danach aus, was meint ihr?
Ja, kann sein. Warum? Also: Was macht es für einen Unterschied? Bzw. warum fragst du? Wenn du es über die Kommandozeile und nicht über eine IDE starten willst, dann tue das halt.
 

Encera

Aktives Mitglied
Ja, kann sein. Warum? Also: Was macht es für einen Unterschied? Bzw. warum fragst du? Wenn du es über die Kommandozeile und nicht über eine IDE starten willst, dann tue das halt.
Ja ich weiß nur nicht wie das genau funktioniert. Hab mir schon 2 Tutorials dazu angesehen, wenn ich versuche die Startdatei über die Konsole zu compilieren und auszuführen kommt ne Meldung "Missing Classes" oder so ähnlich. Macht ja auch irgendwo Sinn da ich ja nur die Startdatei kompiliere.
Und wenn ich das ganze via Eclipse ausführe bekomme ich nicht die Ausgabe in der Konsole wie im Buch. Ich frage mich also ob das daran liegt dass ich das ganze über die Eingabeaufforderung ausführen "muss" damit es klappt oder ob das ganze über Eclipse auch funktionieren müsste und der Fehler woanders liegt. Aber deiner Antwort zufolge dürfte das wohl egal sein
 

KonradN

Super-Moderator
Mitarbeiter
Evtl. macht es Sinn, einfach einmal anzugeben, was Du genau bekommst. Was ist anders? Was passiert und was erwartest Du?

Was auffällt ist der relative Pfad zu dem webapp Verzeichnis. Da muss das Arbeitsverzeichnis stimmen. Aber das kannst Du ja anzeigen lassen: Einfach die Variable webAppDirectory nach der Initialisierung ausgeben - dann kannst Du prüfen, ob es richtig ist.

Aber evtl. weicht die Ausgabe auch einfach ab, weil im webapp Verzeichnis nicht der Inhalt ist wie bei dem Aufruf im Buch? Den prinzipiell ist es ja egal, worüber du es startest. (So das Arbeitsverzeichnis stimmt!)
 

Encera

Aktives Mitglied
Evtl. macht es Sinn, einfach einmal anzugeben, was Du genau bekommst. Was ist anders? Was passiert und was erwartest Du?

Was auffällt ist der relative Pfad zu dem webapp Verzeichnis. Da muss das Arbeitsverzeichnis stimmen. Aber das kannst Du ja anzeigen lassen: Einfach die Variable webAppDirectory nach der Initialisierung ausgeben - dann kannst Du prüfen, ob es richtig ist.

Aber evtl. weicht die Ausgabe auch einfach ab, weil im webapp Verzeichnis nicht der Inhalt ist wie bei dem Aufruf im Buch? Den prinzipiell ist es ja egal, worüber du es startest. (So das Arbeitsverzeichnis stimmt!)
Hab mir das Verzeichnis mal ausgeben lassen, das stimmt.
Konsole.PNG
Das ist ja quasi die Ausgabe das der Server startet, das tut er auch und ich kann problemlos auf mein WebInterface zugreifen. Aber ich bekomme keine Ausgabe dass sich die Knoten (in dem Fall dargestellt durch 2 verschiedene Tomcat Server mit unterschiedlichen Ports) gefunden haben, wie auf dem obigen Bild ersichtlich. Leider wird halt im Buch 0 Beschrieben wie das ganze gestartet bzw. ausgeführt wird deswegen weiß ich auch nicht ob im anderen Code der Blockchain irgendwo ein Fehler ist oder ob ich das ganze halt einfach "falsch ausführe". Tut mir leid das meine Ausführung villeicht etwas vage ist
 

Encera

Aktives Mitglied
@httpdigest danke, les ich mir mal durch 👍

Bin jetzt auch gerade auf die Idee gekommen das es an den Ports liegen könnte, da meine zweite Methode auch auf Port 8080 zugreift obwohl ich eigentlich 8081 angegeben habe...
 

Jw456

Top Contributor
Du müsstest eigentlich zwei Konsollen offen haben. Für jeden Server eine.
Hoffe das ist auch so.


PS.
Laut dem Bild müsste der erste Server den Port 49719 habe ist nicht gut zuerkennen.
Welcher Port wird denn im Code vom Buch benutzt?

Laudt dem Buch sollt du doch für den zweiten 8080 benutzen. Oder was steht da genau?
 
Zuletzt bearbeitet:

Encera

Aktives Mitglied
Du müsstest eigentlich zwei Konsollen offen haben. Für jeden Server eine.
Hoffe das ist auch so.


PS.
Laut dem Bild müsste der erste Server den Port 49719 habe ist nicht gut zuerkennen.
Welcher Port wird denn im Code vom Buch benutzt?

Laudt dem Buch sollt du doch für den zweiten 8080 benutzen. Oder was steht da genau?
Jap, habe 2 Konsolen offen. Die erste Start Methode pinne ich an und die zweite starte ich dann in der anderen Konsole.
Der erste Server hat den Port 8080 und der zweite laut Buch 8081 aber klappt das überhaupt das ich 2 Ports laufen lasse? Was ich bisher so gelesen habe muss ich den zweiten wrsl auch erstmal aktivieren oder?
 

KonradN

Super-Moderator
Mitarbeiter
Jap, habe 2 Konsolen offen. Die erste Start Methode pinne ich an und die zweite starte ich dann in der anderen Konsole.
Der erste Server hat den Port 8080 und der zweite laut Buch 8081 aber klappt das überhaupt das ich 2 Ports laufen lasse? Was ich bisher so gelesen habe muss ich den zweiten wrsl auch erstmal aktivieren oder?
Jeder Port kann nur einmal belegt werden. Daher ist es wichtig, dass Du da unterschiedliche Ports verwendest. Wenn Du da den gleichen Port verwenden würdest, dann müsstest Du beim zweiten Prozess, den du startest, eine Fehlermeldung bekommen, dass Tomcat den Port nicht öffnen kann.
 

Encera

Aktives Mitglied
Jeder Port kann nur einmal belegt werden. Daher ist es wichtig, dass Du da unterschiedliche Ports verwendest. Wenn Du da den gleichen Port verwenden würdest, dann müsstest Du beim zweiten Prozess, den du startest, eine Fehlermeldung bekommen, dass Tomcat den Port nicht öffnen kann.
Hmm okay daran könnte es wohl liegen... Hab zwar Port 8081 bei der zweiten Main angegeben (und Port 8080 in der ersten) aber greift die zweite Main trotzdem auf 8080 zu und eben nicht auf 8081. Muss ich den zweiten dann wrsl. erst irgendwie freigeben oder?
 

Jw456

Top Contributor
Wie der start unter eclipse läuft keine Ahnung.
In intellij starte ich für sowas die IDE starte dort die erste main.
Dann eine zweite IDE und dort die zweite Main Methode.
 

Encera

Aktives Mitglied
2Consoles.PNG
So sieht der Start beider Methoden aus. Links Server 1 Port 8080, rechts Server 2 Port 8081. Scheint also wohl doch zu funktionieren das beide auf einen anderen Port zugreifen oder?
Ich denke dann muss das Problem wohl doch woanders liegen...
 

KonradN

Super-Moderator
Mitarbeiter
Die Starts sehen gut aus. Du hast keine Log-Konfiguration - das sind die ersten drei WARN Hinweise. Ansonsten läuft alles halt an.

Nur wenn da irgendwas neu sein soll, dann würde ich da gewisse Konfiguration erwarten. Oder unterschiede im webapp Ordner. Wenn du einen Tomcat, der bisher stand alone war, mehrfach startest, entsteht da nicht automatisch ein Cluster oder so. Das muss konfiguriert werden.
 

Encera

Aktives Mitglied
Die Starts sehen gut aus. Du hast keine Log-Konfiguration - das sind die ersten drei WARN Hinweise. Ansonsten läuft alles halt an.

Nur wenn da irgendwas neu sein soll, dann würde ich da gewisse Konfiguration erwarten. Oder unterschiede im webapp Ordner. Wenn du einen Tomcat, der bisher stand alone war, mehrfach startest, entsteht da nicht automatisch ein Cluster oder so. Das muss konfiguriert werden.
Für JGroups selbst war eine Standardkonfigurationsdatei dabei die habe ich implementiert aber für Tomcat stand nichts dabei...Das Buch lässt wirklich vieles aus...
Hab mir zu dem was du geschrieben hast mal die Anleitung von httpdigest weiter oben angesehen das meinst du mit im Cluster starten oder? Das Problem ist laut der Anleitung muss ich Änderungen in der Server.xml vornehmen aber ich finde die nirgends auf meinem PC, hab auch schon ne komplette Suche drüberlaufen lassen aber die Datei lässt sich nicht finden
 

Encera

Aktives Mitglied
Im Begleitmaterial zum Buch ist doch in Kapitel 6 der Code. Der hat drei main Methoden. Hast du den mal getestet?
Hast du das Buch auch?
Hab jetzt mal die Musterlösung des Kapitels übernommen und ausgeführt aber die Ausgabe das sich die zwei Knoten gefunden haben kommt immernochnicht.
Die Methode die dafür eigentlich verantwortlich sein sollte wäre die "viewAccepted".

Java:
public class BlockchainNetwork extends ReceiverAdapter implements MinerListener {

    //Variablen
    private JChannel channel;
    private View view;
    private static Logger logger = Logger.getLogger( BlockchainNetwork.class );
    private static Genson genson = new Genson( );
   
    //Konstruktor
    public BlockchainNetwork() throws Exception {
        System.setProperty("java.net.preferIPv4Stack", "true");
        this.channel = new JChannel("src/main/upd.xml");
        channel.setReceiver(this);
        channel.setDiscardOwnMessages(true);
        channel.connect("basicblockchain");
        channel.getState( null, 0 );

    }
   
    @Override public void viewAccepted(View view) {
        if(this.view == null) {
            System.out.println("Received initial view: ");
            view.forEach(System.out::println);
        } else {
            System.out.println("Received new view.");
            List<Address> newMembers = View.newMembers(this.view, view);
            System.out.println("New Members: ");
            newMembers.forEach(System.out:: println);
           
            List<Address> exMembers = View.leftMembers(this.view, view);
            System.out.println("Exited members: ");
            exMembers.forEach(System.out::println);
        }
        this.view = view;
    }
   
    @Override public void receive(Message msg) {
        try {
            String json = new String(msg.getRawBuffer());
            if ( json.contains( "\"type\":\"BlockAdapter\"" ) ) {
                Block block = genson.deserialize(json, BlockAdapter.class).getBlock();
                DependencyManager.getPendingTransactions().clearPendingTransactions(block);
                DependencyManager.getBlockchain().addBlock(block);
                DependencyManager.getMiner().cancelBlock();
            } else if ( json.contains( "\"type\":\"TransactionAdapter\"" ) ) {
               
            Transaction trx = genson.deserialize(json, TransactionAdapter.class).getTransaction();
            DependencyManager.getPendingTransactions().addPendingTransaction(trx);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
    //Transaktionen
    public void sendTransaction(Transaction transaction) throws Exception {
        Message message = new Message(null, transactionToJSON(transaction));
        channel.send(message);
    }
   
    private byte[] transactionToJSON(Transaction transaction) {
        return genson.serializeBytes(new TransactionAdapter(transaction));
    }

    //Blöcke
    public void sendBlock(Block block ) throws Exception {
        Message message = new Message(null, blockToJSON(block));
        channel.send(message);
    }
   
    private byte[] blockToJSON(Block block) {
        return genson.serializeBytes(new BlockAdapter(block));
    }
   
    @Override
    public void notifyNewBlock(Block block) {
        try {
            sendBlock(block);
        } catch (Exception e) {
            logger.error( "Could not send block: " + block );
        }
       
    }
   
    @Override public void getState( OutputStream output ) throws Exception
    {
        System.out.println("Sending state" );
        System.out.println( "Chain Length: " + DependencyManager.getBlockchain( ).getAltChains( ).get( 0 ).size( ) );
        System.out.println( "Difficulty " + DependencyManager.getBlockchain( ).getDifficulty( ) );
        genson.serialize( new BlockchainAdapter( DependencyManager.getBlockchain( ) ), output );
    }

    @Override public void setState( InputStream input ) throws Exception
    {
        System.out.println( "Received state:" );
        BlockchainAdapter blockchainAdapter = genson.deserialize( input, BlockchainAdapter.class );

        DependencyManager.injectBlockchain( blockchainAdapter.getBlockchain( ) );
        System.out.println( "Available Chains: " + blockchainAdapter.getBlockchain( ).getAltChains( ).size( ) );
        System.out.println( "Chain Length: " + blockchainAdapter.getBlockchain( ).getAltChains( ).get( 0 ).size( ) );
        System.out.println( "Best Block: " + blockchainAdapter.getBlockchain( ).getLatestBlock( ) );
        System.out.println( "Difficulty: " + blockchainAdapter.getBlockchain( ).getDifficulty( ) );
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
S iText: zweite Seitenhälfte mit vorhandenen pdf füllen Allgemeine Java-Themen 2
M Variablen Variablenproblem die Zweite! Allgemeine Java-Themen 7
P String die zweite Allgemeine Java-Themen 7
G Klappe die Zweite. JSAPI - Java Speech Allgemeine Java-Themen 5
Saxony zweite Seite bei iReport Allgemeine Java-Themen 3
J gzip, die zweite: java.io.IOException: Not in GZIP format Allgemeine Java-Themen 2
N Permutation die zweite Allgemeine Java-Themen 3
N Aus Anwendung zweite Java-Anwendung öffen. Wie? Allgemeine Java-Themen 6
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
M Keine weitere Eingabe in der Main möglich. Eventueller Ansatz über while. Allgemeine Java-Themen 8
F Konstante an main - Argumenten initialisieren Allgemeine Java-Themen 1
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
W Warum muss void main() public sein? Allgemeine Java-Themen 3
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
L sortiertes Array im main aufrufen klappt nicht. Allgemeine Java-Themen 3
Tort-E Manifest Main-Class Allgemeine Java-Themen 8
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
A main-class Not found Allgemeine Java-Themen 3
A Konstrukt ohne Main für Xml-Parser Allgemeine Java-Themen 1
P JDK installieren Error: Could not find or load main class HelloWorld.java Allgemeine Java-Themen 3
I JFrame Icon in Main übergeben Allgemeine Java-Themen 1
Phash Can't find Main Class Allgemeine Java-Themen 4
X Could not find the main class programm will exit (textdokument) Allgemeine Java-Themen 3
127.0.0.1 Subversion neues SVN Projekt, keine Main gefunden ?! Allgemeine Java-Themen 7
S Could not find the main class Allgemeine Java-Themen 7
B Mal wieder "Could not find the main class" Allgemeine Java-Themen 3
C Could not find the main class. Allgemeine Java-Themen 15
I Main wird nicht gefunden Allgemeine Java-Themen 3
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25
A Could not find main class: start Allgemeine Java-Themen 5
S main() class finden Allgemeine Java-Themen 7
hdi Could not find main class? Allgemeine Java-Themen 8
B Cannot find main-claas... Allgemeine Java-Themen 21
G jar Datei findet Main Class nicht... Allgemeine Java-Themen 2
P Java Editor Could not find the main class GUI. Programm will exit. Allgemeine Java-Themen 3
E Programm von Main Methode starten Allgemeine Java-Themen 9
BattleMaster246 Could not find the Main class Allgemeine Java-Themen 30
reibi Main-Class in Jarfile Allgemeine Java-Themen 3
G Hauptthread anhalten / Unterschied zwischen Main-Thread und dialogelement-Thread Allgemeine Java-Themen 2
badfish Inerhalb der [void main] auf ein Objekt der [protected void] zugreifen Allgemeine Java-Themen 13
N Probleme mit .jar 'Could not find main class' Allgemeine Java-Themen 3
N Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.p Allgemeine Java-Themen 4
J Main-Thread soll auf alleKinder Threads warten Allgemeine Java-Themen 5
B Main Thread Status abrufen Allgemeine Java-Themen 4
N import com.sun.tools.javac.Main; Allgemeine Java-Themen 1
V main(...) aus Klasse in PDF starten? Allgemeine Java-Themen 3
B UML: Main classe verschwindet nach code generierung nicht?! Allgemeine Java-Themen 4
I Signatur von Main-Methoden? Allgemeine Java-Themen 29
T zu Beginn der main: Heap space ermitteln und hochsetzen Allgemeine Java-Themen 11
J Applet in JAR packen - was muss in main() stehen? Allgemeine Java-Themen 12
E beim Ende der main() das Programm nicht beenden Allgemeine Java-Themen 3
J Unicode: cmd parameter (main args); exec params; filenames Allgemeine Java-Themen 2
V Mehrere main() in jar, wie starten? Allgemeine Java-Themen 4
J Methode nicht ausführbar in main Allgemeine Java-Themen 7
P Kann .jar nicht ausführen - main class not found Allgemeine Java-Themen 6
B Jar File und die Main Klassen Allgemeine Java-Themen 3
M zwei main-Methoden Allgemeine Java-Themen 7
L static main - Spezifikation? Allgemeine Java-Themen 7
N Main-Klasse wird beim Aufruf des JARs nicht gefunden Allgemeine Java-Themen 8
J Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 26
G [JDK 6u2] - JAR Failed to load Main-Class manifest attribute Allgemeine Java-Themen 6
P Zugriff von Klasse 2 auf Klasse 1 (die main methode hat) Allgemeine Java-Themen 5
G Programm ohne Main Allgemeine Java-Themen 10
M Parameter an main übergeben aber wie? Allgemeine Java-Themen 4
J jar-Datei enthält keine Main-Class Allgemeine Java-Themen 22
C Mehrere main-Klassen in JAR Allgemeine Java-Themen 2
S Exception in Thread "main" java.lang.NoClassDef. b Allgemeine Java-Themen 2
G "Could not find the main class. Program will exit" Allgemeine Java-Themen 20
A Warum gibts die Main und was sollte drin stehen? Allgemeine Java-Themen 31
B Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 12
S Programmlogik, wo ist die Main? Allgemeine Java-Themen 9
C Mehrere main-Methoden in einer jar Allgemeine Java-Themen 7
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
G DBzugriff funktioniert nach 'Build Main Project' nicht mehr Allgemeine Java-Themen 2
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 15
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
S wie übergebe ich eine Variable aus einer Methode an main() ? Allgemeine Java-Themen 16
B Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 5
S Exception in thread "main" java.lang.StringIndexOu Allgemeine Java-Themen 9
R Ausführen von *.JAR || "Could not find main class" Allgemeine Java-Themen 7
I "Could not find the main class. Program will exit" Allgemeine Java-Themen 6
L boolean aus der main übergeben? Allgemeine Java-Themen 12
H jar-file in anderem main programm ausführen Allgemeine Java-Themen 2
M Klassenname in main-Methode ausgeben? Allgemeine Java-Themen 29
G Exception in thread "main" :? Allgemeine Java-Themen 5
E Exception in Thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 5
B Could not find the main class Allgemeine Java-Themen 2
A Was haltet ihr von einer standardisierten Main Klasse? Allgemeine Java-Themen 4
E Klasse dynamisch über main-Methode aufrufen Allgemeine Java-Themen 9
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben