Como executar o frasco feito do comando 'lein jar'?
Pergunta
Este é um acompanhamento para essa questão.
Depois de executar 'Lein Jar', eu recebo 'MyProject-1.0.0-snapshot.jar', que não contém o clojure-1.2.0-beta1.jar e o clojure-contrrib-1.2.0-beta1.jar.
E executar 'Lein Uberjar' me dá dois arquivos JAR. O primeiro (que termina com -standalone.jar) é o frasco que contém tudo, e o segundo é o mesmo que o frasco gerado com 'lein jar'.
Esta é a questão do frasco com a segunda. Não há problema em correr com o primeiro frasco, como expliquei no anterior publicar.
Quando eu corro
java -cp PATH_TO_THE_CLOJURE_AND_CONTRIB.jar:$CLASSPATH -jar myproject-1.0.0-SNAPSHOT.jar'
, Estou tendo o erro a seguir.
Caused by: java.lang.ClassNotFoundException: clojure.lang.IFn at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
O que pode estar errado, pensei em usar o 'MyProject-1.0.0-snapshot.jar da mesma maneira com' myProject-1.0.0-snapshot-padronia.jar 'se eu apontar para os arquivos JAR usando a opção -cp.
Há algo mais que eu tive que fazer?
ADICIONADO
java -cp ALLTHE_JAR_PATH myproject.core
resolve o problema.
Solução
Se você estiver usando o Leiningen 1.2, provavelmente está sendo atingido por um bug pelo qual as dependências serão excluídas antes da criação de um Uberjar (obviamente derrotando o ponto do Uberjar). Por favor, faça o downgrade para 1.1 e aguarde a nova versão (que deve chegar em breve) ou use uma finalização da cabeça da cabeça de Lein (conforme descrito na seção sobre Hacking Leiningen no Lein's ReadMe).
Depois de fazer isso, você poderá produzir uma jarra independente com lein uberjar
e diz java -jar name-of-your-standalone.jar
Para iniciar seu aplicativo.
Como alternativa, você pode criar um frasco comum com lein jar
e dizer algo como java -cp '$PROJECT_ROOT/lib/*:your-app.jar' your-app.main
(Onde your-app.main
é a classe principal do seu aplicativo; Além disso, substitua $PROJECT_ROOT
com o caminho apropriado e fornecer um caminho para your-app.jar
, é claro). o lib/*
A coisa só funcionará no JDK 1.6; Com 1.5, você teria que incluir cada jarra separadamente. Observe que ao usar -jar
, -cp
e $CLASSPATH
são ignorados; Somente o caminho de classe especificado no manifesto do frasco (se houver) é levado em consideração.