To jest mało wygodne. To może maven? Hm, sprawdzam, integracja z Eclipse dalej leży choć wyraźnie się poprawiła w ostatnim roku, na Idea brak miejsca, Netbeans nie lubie. Hm, jeszcze jest Ivy...
Po analizie różnych rozwiązań, za najprostsze uznałem Grape. Grape to:
- Deklaratywne zarządzanie zależnościami za pomocą adnotacji (@Grab).
- To co potrzeba zostanie ściągnięte do lokalnego repozytorium i dorzucone do classpath w trakcie uruchamiania skryptu / klasy.
- Obsługa linii poleceń – (grape install <groupid> <artifactid> [<version>])
- Nic nie trzeba instalować jeśli ma się Groovy
Wystarczy deklaratywnie napisać czego nam potrzeba . Grape korzysta z Ivy, więc mamy dostęp do całego dobrodziejstwa znanego z repozytoriów Maven. Przykład z Hibernate:
package hello;
import javax.persistence.*;
import org.hibernate.*;
import org.hibernate.cfg.*;
//Wymagane zaleznosci:
@Grapes([
@Grab(group='org.hibernate', module='hibernate-annotations', version='3.4.0.GA'),
@Grab(group='hsqldb', module='hsqldb', version='1.8.0.7'),
//niestety slf4j i javaassist trzeba dodać ręcznie bo w POM są pewnie jako opcjonalne (lub wcale), ale domyślnie wybierane przez Hibernate
@Grab(group='org.slf4j', module='slf4j-simple', version='1.4.2'),
@Grab(group='javassist', module='javassist', version='3.4.GA')
])
@Entity
class Book{
@Id @GeneratedValue(strategy = GenerationType.AUTO)
Long id
String title
String author
String toString(){ "$title by $author" }
}
def prepareSessionFactory(){
def config = new AnnotationConfiguration()
[
"hibernate.dialect": "org.hibernate.dialect.HSQLDialect",
"hibernate.connection.driver_class": "org.hsqldb.jdbcDriver",
"hibernate.connection.url": "jdbc:hsqldb:mem:demodb",
"hibernate.connection.username": "sa",
"hibernate.connection.password": "",
"hibernate.hbm2ddl.auto": "create-drop",
"hibernate.show_sql": "true",
"hibernate.current_session_context_class": "thread"
].each{ key, value -> config.setProperty (key, value)}
config.addAnnotatedClass(Book)
config.buildSessionFactory()
}
def session = prepareSessionFactory().openSession();
Transaction tx = null;
try{
tx = session.beginTransaction()
def b = new Book(title:"Narrenturm",author:"Sapkowski")
session.persist b
tx.commit()
tx = session.beginTransaction()
Book b2 = session.createQuery("From Book").list().first()
println b2
tx = null
}catch(HibernateException e){
if(tx != null) tx.rollback()
println e
}finally{
session.close()
}
Uruchamiam z poziomu Eclipse, można też wrzucić do GroovyConsole i uruchomić, wszystkie wymagane biblioteki powinny się ściągnąć same, przykład ze strony Groovy mi dział, a ten nie... To znaczy ściąganie działa, ale Hibernate nie. Z poziomu Eclipse mi to działa, z GroovyConsole wyskakuje za to błąd dostępu do pól, ciekawe... Pewnie kwestia generowania kodu. Na razie działające Eclipse z podpowiadaniem kodu mi wystarcza, no i mały skrypt co kopiuje wszystkie biblioteki ściągnięte przez Grapes do Eclipse ;)