Verschillen tussen “Java -CP” en “Java -jar”?

Wat is het verschil tussen het uitvoeren van een Java-applicatie met
java -cp CLASSPATHen java -jar JAR_FILE_PATH? Is er een van hen de voorkeur aan de ander voor het uitvoeren van een Java-applicatie? Ik bedoel, welke van deze manieren duurder is voor JVM (volgens hun machinebronnengebruik)?

Welke zal ervoor zorgen dat JVM meer threads spawnt terwijl u probeert de aanvraag uit te voeren?


Antwoord 1, Autoriteit 100%

Ik geef de voorkeur aan de eerste versie om een ​​Java-applicatie te starten, alleen omdat het minder valkuilen heeft (“WELKOM BIJ CLASSPATHEHEL”). De tweede vereist een uitvoerbaar jar-bestand en het klassenpad voor die toepassing moet worden gedefinieerd in het manifest van de pot (alle andere klassenpadaangifte zal stil worden genegeerd …). Dus met de tweede versie zou je in de pot moeten kijken, lees dan het manifest en probeer erachter te komen of de classpath-vermeldingen geldig zijn van waar de pot is opgeslagen … dat is vermijdbaar.

Ik verwacht geen prestatievoordelen of nadelen voor beide versie. Het vertelt gewoon de JVM welke klasse te gebruiken voor de hoofddraad en waar het de bibliotheken kan vinden.


Antwoord 2, Autoriteit 62%

Met de -cpARGUMENT U verstrekt het ClassPath I.E. Path (S) naar extra klassen of bibliotheken die uw programma nodig heeft bij het opstellen of uitvoeren. Met -jargeeft u het uitvoerbare jar-bestand op dat u wilt uitvoeren.

U kunt ze beide niet specificeren. Als u probeert te gebruiken java -cp folder/myexternallibrary.jar -jar myprogram.jarDan werkt het niet echt. Het klassenpad voor die pot moet in zijn manifest worden gespecificeerd, niet als een -cpargument.

U kunt meer over deze hier en hier .

PS: -cpEN -classpathZIJN SIMIGONS.


Antwoord 3, Autoriteit 20%

Bij gebruik van java -cpU bent verplicht om volledig gekwalificeerde hoofdklasse naam, b.v.

java -cp com.mycompany.MyMain

Bij gebruik van java -jar myjar.jarUw JAR-bestand moet de informatie over hoofdklasse verstrekken via Manifest.mf in het JAR-bestand in de map META-INF:

Main-Class: com.mycompany.MyMain


Antwoord 4, Autoriteit 10%

Java -CP ClassPath is noodzakelijk als u alle code in het klassenspad wilt opgeven. Dit is handig voor debuggingcode.

Het uitvoerbare bestand van JARRED: java -jar JarFilekan worden gebruikt als u de app wilt starten met een enkele korte opdracht. U kunt extra afhankelijke potbestanden in uw manifest opgeven met behulp van ruimte gescheiden potten in een klasse-padinvoer, b.v.:

Class-Path: mysql.jar infobus.jar acme/beans.jar

Beide zijn vergelijkbaar in termen van prestaties.


Antwoord 5, Autoriteit 2%

Zoals al gezegd, is de -CP alleen voor het vertellen van de JVM in de opdrachtregel die klasse om te gebruiken voor de hoofddraad en waar het de bibliotheken kan vinden (het definiëren van klassenpad). In -Jar verwacht het de klasse-pad en de hoofdklasse die moet worden gedefinieerd in het JAR-bestandsvorm. Dus andere is voor het definiëren van dingen in de opdrachtregel, terwijl andere ze in het pot-manifest vinden. Er is geen verschil in prestaties. Je kunt ze niet tegelijkertijd gebruiken, -jar zal de -CP opheffen.

Hoewel zelfs als u -cp gebruikt, het manifestbestand nog steeds wordt gecontroleerd. U kunt dus enkele van de klassenpaden in het manifest definiëren en sommige in de opdrachtregel. Dit is met name handig wanneer u afhankelijk bent van een derde partij jar, die u mogelijk niet bij uw build levert of niet wilt leveren (in de verwachting dat deze bijvoorbeeld al in het systeem wordt gevonden waarop deze moet worden geïnstalleerd). U kunt het dus gebruiken om externe potten te leveren. De locatie kan per systeem verschillen of het kan zelfs een andere versie hebben op een ander systeem (maar met dezelfde interfaces). Op deze manier kunt u de app bouwen met een andere versie en de daadwerkelijke afhankelijkheid van derden toevoegen aan het klassenpad op de opdrachtregel wanneer u deze op verschillende systemen uitvoert.


Antwoord 6

Er zal geen verschil zijn in termen van prestaties.
Met java – cp kunnen we de vereiste klassen en jar’s in het klassenpad specificeren voor het uitvoeren van een java-klassenbestand.

Als het een uitvoerbaar jar-bestand is. Als de opdracht java -jar wordt gebruikt, vindt jvm de klasse die moet worden uitgevoerd vanuit het bestand /META-INF/MANIFEST.MF in het jar-bestand.

Other episodes