Skip to content

Latest commit

 

History

History
285 lines (204 loc) · 11.7 KB

maven.md

File metadata and controls

285 lines (204 loc) · 11.7 KB

Ohjeita Maveniin

Projektin luominen

Ohje maven-muotoisen projektin luomiseen NetBeansilla täällä

Vaikka käyttäisit JavaFX:ää, kannattaa projektia varten silti luoda ohjeen mukaan "normaali" maven-projekti.

Testit ja Testikattavuus

Lisää tiedostoon pom.xml seuraavat

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.3</version>
            <executions>
                <execution>
                    <id>default-prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Huomaa, että määrittelyt on lisättävä Project-tagien sisälle:

Voit nyt suorittaa testauskattavuuden mittaamisen komennolla

mvn test jacoco:report

Katso lisää viikon 2 laskareista.

Koodin huomiotta jättäminen kattavuusraportissa

Joskus haluamme jättää osan koodista, esim. käyttöliittymän huomioimatta kattavuusraportissa.

Oletetaan, että projekti näyttää seuraavalta

oletusarvoisesti testauskattavuus raportoidaan kaikesta koodista

Yksittäisen pakkauksen koodit on helppo poistaa raportin alaisuudesta lisäämällä jacoco-pluginin määrittelyyn excludes-osa seuraavasti:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.0</version>
    <configuration>
        <excludes>
            <exclude>pokemontietokanta/ui/*</exclude>
        </excludes>
    </configuration>
    <executions>
        <execution>
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Excludesin alle voi lisätä tarvittaessa myös useampia excludeja. Lisää tietoa exclude-syntaksista internetissä, esim. täältä.

Maven-komentojen suorittaminen NetBeansista

Ohje täällä.

Ulkoisten kirjastojen käyttäminen Mavenin avulla

Mavenin avulla omassa koodissa on erittäin helppo ottaa käyttöön muiden ohjelmoijien toteuttamia apukirjastoja.

Internet on täynnä erilaisiin tilanteisiin sopivia apukirjastoja.

Oletetaan, että haluamme tehdä sovelluksessa tilastotieteellistä analyysiä. Googlella Löydämme Apache Commons -projektista löytyvän matematiikkakirjaston, jonka tarjoamat tilastotieteen työvälineet vaikuttavat lupaavalta.

Apache Commonsin dokumentaatio ei suoraan kerro, miten koodi saadaan liitettyä Maven-muotoiseen projektiin. Se on kuitenkin helppoa, tarvitsemme tiedon siitä miten projekti löytyy Mavenin repositorioista eli "koodisäiliöistä".

Googlaamalla "Apache Commons Math Maven" löytyy sivu https://mvnrepository.com/artifact/org.apache.commons/commons-math3/3.6 joka näyttää seuraavalta

Saamme liitettyä kirjaston projektiimme, kopioimalla sivulla olevan dependency-määritelmän projektin pom.xml-tiedoston osan dependencies alle:

Kirjastosta on nyt otettu uusin versio 3.6.1, minkä olemassaolosta mvnrepository.com antoi vihjeen.

Suorittamalla NetBeansissa Clean and Build lataa Maven kirjaston koodin. NetBeans-projektin Dependencies-kansio varmistaa asian:

Voimme nyt käyttää kirjaston luokkia koodissamme:

import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import pokemontietokanta.domain.Pokemon;

public class Main {
    public static void main(String[] args) {
        Pokemon p = new Pokemon("arto");
        p.go();

        DescriptiveStatistics stats = new DescriptiveStatistics();

        int[] strengthOfPokemons = { 58, 5, 10, 45, 17};

        for( int i = 0; i < strengthOfPokemons.length; i++) {
            stats.addValue(strengthOfPokemons[i]);
        }

        double mean = stats.getMean();
        double std = stats.getStandardDeviation();
        double median = stats.getPercentile(50);

        System.out.println("mean "+mean);
        System.out.println("standar deviation "+std);
        System.out.println("median "+median);
    }
}

Apache Commonsissa olevat kirjastot ovat varsin hyvin dokumentoituja. Jos ja kun löydät googlaamalla projektiisi sopivia kirjastoja, niiden dokumentaation taso vaihtelee. Sekään ei ole ennenkuulumatonta, että kirjastojen koodissa on bugeja. Nykyään melkein kaikkien kirjastojen koodi löytyy GitHubista. Kirjastojen GitHub-sivuilta selviää mm. se onko kirjasto edelleen aktiivisen ylläpidon alaisena. Jos kirjaston GitHubissa ei ole ollut päivityksiä pitkään aikaan, esim. vuoteen, kannattaa kirjastoon suhtautua suurella skeptisyydellä. Useimpien kirjastojen dokumentaatiotkin ovat GitHubissa. Apache Commons on tämän suhteen poikkeus, sen kirjastojen koodia ei edes hallinnoida gitin vaan jo hieman esihistoriallisen svn-versionhallintajärjestelmän avulla.

Checkstyle

Katso lisää täältä

JavaDoc

Katso lisää täältä

JavaFX

Javan versiosta 8 alkaen graafisten käyttöliittymien tekoon tarkoitettu osa kieltä eli JavaFX ei ole enää ollut mukana JDK:ssa eli kielen "asennuspaketissa". JavaFX onkin liitettävä projektiin maven-riippuvuutena. Tämä onnistuu lisäämällä tiedoston pom.xml osioon dependencies seuraava

<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-controls</artifactId>
    <version>12.0.2</version>
</dependency>

ja osioon plugins seuraava

<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.3</version>
    <configuration>
        <mainClass>org.openjfx.App</mainClass>
    </configuration>
</plugin>

Näet konfiguraation kokonaisuudessaan kurssin esimerkkisovelluksesta.

Käyttäessäsi Javan versiota 8, mavenin lisäkonfiguraatiota ei tarvita. Tosin ainakin laitoksen cubbli-Linuxeilla sovellus näyttää toimivan samoilla konfiguraatioilla myös käyttäessäsi Javan versiota 8.

JavaFX aiheuttaa hankaluuksia myös seuraavassa luvussa esitettyyn jar-tiedostojen generointiin, eräs tapa ongelmien kiertämiseen on kerrottu sitä seuraavassa luvussa täällä.

Ongelmia javaFX kanssa

Jos JavaFX käyttöliittymäsi näyttää samalta kuin alla olevassa kuvassa, niin siihen on yhtenä ratkaisuna vaihtaa pom.xml tiedostossa olevan javafx-controls:in versioksi 15.0.1.

Jarin generointi

Maven-muotoinen projekti voidaan helposti paketoida jar-paketiksi, jolloin ohjelmaa voidaan suorittaa NetBeansin ulkopuolelta.

Jarin generoimiseen tarvitaan seuraava konfiguraatio:

<build>
    <plugins>
        // muut pluginit ovat tässä välissä
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>pokemontietokanta.ui.Main</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Huomaa, että kohdan mainClass on oltava täsmälleen sama kuin pääohjelman sisältävän luokan täydellinen nimi:

  • Saat nyt luotua jar-tiedoston antamalla komentoriviltä komennon mvn package
  • komento luo hakemiston target sisälle kaksi jar-päätteistä tiedostoa, niistä oikea on se, jonka nimessä ei ole sanaa original
  • ohjelman voi nyt suorittaa komennolla java -jar jartiedoston_nimi.jar

Jar-tiedosto on mahdollista suorittaa millä tahansa koneella, olettaen että koneelle on asennettu Javan versio 1.8

JavaFX ja jar

Kuten tämä Stackoverflow-artikkeli kertoo, Javan versiota 11 käyttäessä edellisen luvun tekniikalla generoitu jar-tiedosto ei toimi jos ohjelma käyttää JavaFX:ää. Artikkeli kertoo myös kikan, minkä avulla sovellus saadaan toimimaan. Kurssin esimerkkisovelluksesta noudattaakin jo kyseistä kikkaa.

Normaalisti JavaFX-sovellusten pääohjelma on luokassa, joka perii luokan Application. Kurssin esimerkkisovelluksen pääohjelma on luokassa TodoUi:

public class TodoUi extends Application {
    // ...

    @Override
    public void init() throws Exception {
      // ...
    }


    @Override
    public void start(Stage primaryStage) {
        // ...
    }

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

}

Kaikki vaikuttaa toimivan niin kauan kunnes yritetään luoda suoritettava jar-tiedosto. Se ei toimi, sillä JavaFX-suoritusympäristö ei tule sisällytetyksi jariin.

Ongelma korjautuu kun sovellukselle tehdään uusi pääohjelma:

public class Main {
    public static void main(String[] args) {
        TodoUi.main(args);
    }
}

Nyt pääohjelma siis ei peri luokkaa Application, mutta kutsuu välittömästi vanhaa "todellista" pääohjelmaa.

Pääohjelman muutos tulee merkata pom.xml-tiedostoon shade-pluginin mainClass-attribuuttiin

Nyt generoitu jar-tiedosto toimii!