Tässä osassa kerrotaan, miten Java-koontipolku asetetaan. Koontipolku on luokkapolku, jota käytetään Java-projektin (IJavaProject) luontiin.
Luokkapolku on yksinkertaisesti taulukko luokkapolun merkinnöistä (IClassPathEntry), jotka kuvaavat käytettävissä olevat tyypit. Tyypit voivat näkyä lähdekielisessä tai binaarisessa muodossa, ja merkintöjen järjestys polulla määrittää tyyppien tulkinnan noutojärjestyksen luonnin yhteydessä.
Java-koontipolku vaikuttaa Java-projektin elementin rakenteeseen. Voit kysellä projektista sen pakettifragmentin juuria (IPackageFragmentRoot). Jokainen luokkapolun merkintä on määritetty vastaamaan ainakin yhtä pakettifragmentin juurta, joista jokaisessa on puolestaan joukko pakettifragmentteja.
Tämä koontipolun kuvaus ei käsittele Java-ohjelmatiedostojen polkua, jonka voi määrittää erikseen koontipolusta. (Lisätietoja ajonaikaisesta luokkapolusta on ohjeaiheessa Java-koodin ajo.)
Projektin koontipolkua voi muuttaa ohjelmallisesti käyttämällä projektin Java-elementissä
setRawClasspath -metodia. Seuraava koodi asettaa projektin resurssin luokkapolun:
IProject project = ... // hae jokin projektin resurssi
IJavaProject javaProject = JavaCore.create(project);
IClasspathEntry[] newClasspath = ...;
javaProject.setRawClasspath(newClasspath, someProgressMonitor);
(Huomautus: Termin "muotoilemattoman (raw)" luokkapolun käyttö painottaa sitä seikkaa, että mitään merkintöjen sijainnin kuvaukseen käytettyjä muuttujia ei ole tulkittu.)
Java-koontipolku tallennetaan tiedostoon '.classpath' projektin tiedostorakenteeseen. Tämän tiedoston tarkoituksena on tuottaa tapa, jolla Java-koontipolun asetukset voidaan määrittää yhteiskäyttöön toisten kanssa jonkin lähdekoodisäilön avulla. Tätä tiedostoa ei pidä milloinkaan muokata manuaalisesti, sillä se voi vioittua.
Luokkapolun merkinnät voidaan määrittää factory-metodeilla, jotka on määritetty JavaCore-lisäosassa. Luokkapolun merkinnät voivat viitata mihin tahansa seuraavista objekteista:
Seuraavassa on esimerkki luokkapolun merkinnästä, joka ilmaisee projektin 'MyProject' lähdekansion 'src':
IClassPathEntry srcEntry = JavaCore.newSourceEntry(new Path("/MyProject/src"));
Seuraavassa on esimerkki luokkapolun merkinnästä, joka ilmaisee projektin 'MyProject' luokkatiedostokansion 'lib':
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("/MyProject/lib"),
null, //ei lähdettä
null, //ei lähdettä
false); //ei viety
Seuraavalla luokkapolun merkinnällä on lähdeliitos:
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("d:/lib/foo.jar"), // kirjaston sijainti
new Path("d:/lib/foo_src.zip"), //lähdearkiston sijainti
new Path("src"), //lähdearkiston juurihakemistopolku
true); //viety
Lähdearkiston juurihakemistopolku kuvaa lähdearkiston sisällä olevan juurihakemiston sijainnin. Jos sen asetuksena on null, järjestelmä päättelee arkiston juurihakemiston dynaamisesti.
Seuraava luokkapolun merkintä ilmaisee edellytetyn projektin 'MyFramework'.
IClassPathEntry prjEntry = JavaCore.newProjectEntry(new Path("/MyFramework"), true); //viety
On mahdollista rekisteröidä automaattinen luokkapolun muuttujan alustustoiminto, joka kutsutaan laajennuspisteen org.eclipse.jdt.core.classpathVariableInitializer avulla työtilan aloituksen yhteydessä.
Seuraava luokkapolun merkintä ilmaisee kirjaston, jonka sijainti säilytetään muuttujassa 'HOME'. Lähdeliitos määritetään muuttujilla 'SRC_HOME' ja 'SRC_ROOT' :
IClassPathEntry varEntry = JavaCore.newVariableEntry(
new Path("HOME/foo.jar"), // kirjaston sijainti
new Path("SRC_HOME/foo_src.zip"), //lähdearkiston sijainti
new Path("SRC_ROOT"), //lähdearkiston juurihakemistopolku
true); //viety
JavaCore.setClasspathVariable("HOME", new Path("d:/myInstall"), null); // ei tilannevalvontaa
On mahdollista rekisteröidä automaattinen luokkapolkusäilön alustustoiminto, joka kutsutaan tarvittaessa laajennuspisteen org.eclipse.jdt.core.classpathContainerInitializer kautta, kun säilö tarvitsee sitoa.
Seuraava luokkapolkumerkintä ilmaisee järjestelmäluokan kirjastosäilön:
IClassPathEntry varEntry = JavaCore.newContainerEntry(
new Path("JDKLIB/default"), // säilö 'JDKLIB' + vihje 'oletus'
false); //ei viety
JavaCore.setClasspathContainer(
new Path("JDKLIB/default"),
new IJavaProject[]{ myProject }, // 'myProject'-arvo
new IClasspathContainer[] {
new IClasspathContainer() {
public IClasspathEntry[] getClasspathEntries() {
return new IClasspathEntry[]{
JavaCore.newLibraryEntry(new Path("d:/rt.jar"), null, null, false);
};
}
public String getDescription() { return "Basic JDK library container"; }
public int getKind() { return IClasspathContainer.K_SYSTEM; }
public IPath getPath() { return new Path("JDKLIB/basic"); }
}
},
null);
Luokkapolun lähdemerkinnälle voi osoittaa poissulkemismallin, joka estää tiettyjä lähdekansion resursseja näkymästä luokkapolussa. Mallia käyttämällä voidaan suodattaa resurssirakenteen tietyt osat pois. Jokainen poissulkemismallin polku on suhteessa luokkapolkumerkintään ja käyttää mallimekanismia, joka on samankaltainen kuin Ant-apuohjelman malli. Poissulkemismallien avulla voidaan määrittää sisäkkäisiä lähdekansioita, kunhan ulompi malli sulkee pois sisemmän mallin.
Lisätietoja poissulkemismalleista on ohjeaiheessa getExclusionPatterns.
Java-projektin sovellusohjelmaliittymä isOnClasspath tarkistaa sekä lisäys- että poissulkemismallit, ennen kuin se selvittää, onko tietty resurssi luokkapolussa.
Kommentit:
IPath sourceFolder = new Path("/MyProject/src"); IPath outputLocation = sourceFolder.append("bin"); IClassPathEntry srcEntry = JavaCore.newSourceEntry( sourceFolder, // lähdekansion sijainti new Path[] { outputLocation }, // poissuljettu sisäkkäinen kansio outputLocation); // tulostussijainti
Luokkapolun lähdemerkinnälle voi osoittaa myös lisäysmallin, joka määrittää eksplisiittisesti luokkapolussa näkyvät resurssit. Jos poissulkemismalleja ei ole määritetty, lähdemerkintä sisältää kaikki liittyvät tiedostot tämän lähdemerkinnän polusta haarautuvasta resurssirakenteesta. Kun yksi tai usea lisäysmalli määritetään, vain määritetyt resurssirakenteen osat sisällytetään. Jokaisen määritetyn polun on oltava suhteellinen polku, ja se tulkitaan suhteessa tämän lähdemerkinnän polkuun. Tiedostomalleissa erotetaan isot ja pienet kirjaimet. Tiedosto, joka vastaa ainakin yhtä näistä malleista, sisällytetään vastaavaan pakettifragmentin juureen, ellei kyseisen merkinnän yksi tai usea poissulkemismalli sulje sitä pois.
Lisätietoja polkumallien rakenteesta ja semantiikasta on ohjeaiheessa getExclusionPatterns. Jos lisäysmalleja ei ole, tämä vastaa semanttisesti eksplisiittistä lisäysmallia **
.
Java-projektin sovellusohjelmaliittymä isOnClasspath tarkistaa sekä lisäys- että poissulkemismallit, ennen kuin se selvittää, onko tietty resurssi luokkapolussa.
Esimerkkejä:
src/**
yksin sisällyttää kaikki tiedostot pääkansiosta src
.
src/**
ja tests/**
sisällyttävät kaikki tiedostot pääkansioista src
ja tests
.
src/**
yhdessä poissulkemismallin src/**/Foo.java
kanssa sisällyttää kaikki tiedostot pääkansiosta src
lukuun ottamatta tiedostoja, joiden nimi on Foo.java
.