Simple design Matteo Vaccari http://matteo.vaccari.name/ Milano XP User Group, 19 settembre 2007 1
Simple project configuration Simple interfaces Simple (internal) design 2
5 minuti Installare ed eseguire il progetto non deve richiedere più di 5 minuti 3
I. Scaricare maven >= 2.06 e aggiungere l'eseguibile di maven nella variabile $PATH II. Importare il certificato pubblico del servernel truststore della JVM(tipicamente in $JAVA_HOME/jre/lib/security/cacerts). Questo può essere fatto a riga di comando tramite l'utility keytool o in modalità grafica tramite la comoda utility Portecle 4
III.Configurare la proprie credenziali per maven copiando il file settings.xml opportunamente modificato nella cartella $HOME/.m2 (se si vuole configurare per user) o in $M2_HOME/conf (se si vuole configurare system-wide). Va inoltre impostato il repository per essere usato come repository di proxy. 5
IV.Aggiungere al repository maven la versione da me patchata di wagon-webdav-provider plugin e il suo POM. Questo si ottiene (dopo aver scaricato i file in una cartella che chiameremo $DOWNLOADFOLDER) lanciando il comando cd $DOWNLOADFOLDER mvn install:install-file -DgroupId=org.apache.maven.wagon -DartifactId=wagon-webdav -Dversion=1.0-beta-3 -Dpackaging=jar -Dfile=wagon-webdav-1.0-beta-3.jar mvn install:install-file -DgroupId=org.apache.maven.wagon - DartifactId=wagon-webdav -Dversion=1.0-beta-3 - Dpackaging=pom -Dfile=wagon-webdav-1.0-beta-3.pom 6
V. Scaricare i sorgenti con svn co https://www.example.com/repos/ dev/.../trunk VI... VII... VIII... XLVI.... non abbiamo ancora finito... 7
Ho installato il progetto su 5 macchine, e ogni volta ho perso una giornata. I problemi erano sempre diversi... 8
There must be a better way 9
Per scaricare il progetto: svn co https://svn.mplatform.it/svn/mp/abc-unico/trunk Carica in Eclipse i due progetti abc-unico e abc-da. Per vedere funzionare il progetto: Esegui cd trunk/abc-unico script/create_db.names.sh script/server.sh Apri il browser alla url http://localhost:8080/ Inserisci admin/admin 10
#!/bin/bash # create_db.names.sh -- ricostruisce i DB echo 'Drop db.names...' mysqladmin -uroot --force drop abc_development mysqladmin -uroot --force drop abc_test echo 'Create db.names...' mysqladmin -uroot create abc_development mysqladmin -uroot create abc_test echo 'grant all on abc_development.* to abc@localhost;' mysql -uroot echo 'grant all on abc_test.* to abc@localhost;' mysql -uroot echo 'Build schema...' cat db/???_*.sql mysql -uabc abc_development cat db/???_*.sql mysql -uabc abc_test echo 'Populate development...' mysql -uabc abc_development < db/populate.sql mysql -uabc abc_development < db/user_agents.sql 11
Simple configuration 12
## TEST ## # portal.url = https://www.xxx.net:8449/foo # portal.db.username = zero9it # portal.db.password = 8an81r0 # OPTIONS portal.type = all portal.encoding = UTF-8 portal.language = it portal.incremental = false portal.xml = content.xml... 13
Capisco il significato delle var di configurazione? Sono tutte necessarie? Posso conservare le configurazioni di tutti gli ambienti in un solo progetto? 14
development: db.name: abc_development db.username: abc db.password: "" db.host: localhost test: db.name: abc_test db.username: abc db.password: "" db.host: localhost production: db.name: abcdb db.username: abc_user db.password: secret db.host: localhost 15
SimpleConfig.get( db.hostname ); SimpleConfig.setEnvironment( test ); 16
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- livello di debug --> <appender name="console" class="org.apache.log4j.consoleappender"> <param name="target" value="system.out"/> <layout class="org.apache.log4j.patternlayout"> <param name="conversionpattern" value="[h3gflat] %d{dd-mmm HH:mm:ss} [%C.%M] [%L] %p - %m%n"/> </layout> </appender> <appender name="appender" class="org.apache.log4j.dailyrollingfileappender"> <param name="append" value="true"/> <param name="datepattern" value=".yyyy-mm-dd"/> <param name="file" value="${catalina.home}/logs/h3gflat/webapp.log"/> <layout class="org.apache.log4j.patternlayout"> <param name="conversionpattern" value="%d [%t] %c.%m %p - %m%n"/> </layout> </appender> <appender name="selector" class="org.apache.log4j.dailyrollingfileappender"> <param name="append" value="true"/> <param name="datepattern" value=".yyyy-mm-dd"/> <param name="file" value="${catalina.home}/logs/h3gflat/content_selector.log"/> <layout class="org.apache.log4j.patternlayout"> <param name="conversionpattern" value="%d [%t] %c.%m %p - %m%n"/> </layout> </appender> <appender name="hbappender" class="org.apache.log4j.dailyrollingfileappender"> <param name="append" value="true"/> <param name="datepattern" value=".yyyy-mm-dd"/> <param name="file" value="${catalina.home}/logs/h3gflat/hibernate.log"/> <layout class="org.apache.log4j.patternlayout"> <param name="conversionpattern" value="%d [%t] %c.%m %p - %m%n"/> </layout> </appender>... 17
public class SimpleLogger { private static final Log log = LogFactory.getLog(SimpleLogger.class); private static final String DEFAULT_LEVEL = "INFO"; public static void info(object message) { log.info(message); } public static void configure(simpleconfig config) { String level = config.get("log.level", DEFAULT_LEVEL); String pathname = config.get("log.pathname"); if ("".equals(pathname)) { configurestandardoutput(level); } else { configurefileappender(pathname, level); } } 18
static public void configurefileappender(string pathname, String level) { Properties p = new Properties(); p.setproperty("log4j.appender.file", "org.apache.log4j.dailyrollingfileappender"); p.setproperty("log4j.appender.file.file", pathname); p.setproperty("log4j.appender.file.append", "true"); p.setproperty("log4j.appender.file.datepattern", "'.'yyyy-mm-dd"); p.setproperty("log4j.appender.file.layout", "org.apache.log4j.patternlayout"); p.setproperty("log4j.appender.file.layout.conversionpattern", "%d [%c] %m%n"); p.setproperty("log4j.rootlogger", level + ", File"); } System.setProperty("log4j.defaultInitOverride", "true"); PropertyConfigurator.configure(p); 19
SimpleLogger.configure(SimpleConfig.getConfig());... SimpleLogger.info( hai visto com è semplice?!? ); 20
Simple architecture Don t do the database s work EJB vs. Plain Old Java Objects (POJOs) Don t do the network s work WS_* vs. REST CORBA, RMI, DCOM vs. plain socket Don t do the operating system s work 21