我使用.jar开发一个项目来重用代码.
所以我在.jar上命名为TOOLS.jar,我在文件HelloWorld.java中开发了一个简单的应用程序,它从TOOLS.jar引用我的包TOOLS
我用这个命令行编译:
javac -g -d C:\MyApp -cp TOOLS.jar HelloWorld.java
Run Code Online (Sandbox Code Playgroud)
它很成功,当我想执行我的应用程序时,我使用这个命令(我在C:\ MyApp文件夹中):
java -cp <path>\TOOLS.jar;. HelloWorld
Run Code Online (Sandbox Code Playgroud)
它很成功,但我的问题是:
当我有多个外部.jar时,如何执行我的应用程序?
我是否必须使用-cp选项在命令中添加每个?
有没有办法只生成一个二进制文件并执行它(与C程序一样的.exe)?
我正在尝试使用sbt-assembly将scala项目转换为可部署的胖jar .当我在sbt中运行我的程序集任务时,我收到以下错误:
Merging 'org/apache/commons/logging/impl/SimpleLog.class' with strategy 'deduplicate'
:assembly: deduplicate: different file contents found in the following:
[error] /Users/home/.ivy2/cache/commons-logging/commons-logging/jars/commons-logging-1.1.1.jar:org/apache/commons/logging/impl/SimpleLog.class
[error] /Users/home/.ivy2/cache/org.slf4j/jcl-over-slf4j/jars/jcl-over-slf4j-1.6.4.jar:org/apache/commons/logging/impl/SimpleLog.class
Run Code Online (Sandbox Code Playgroud)
现在来自sbt-assembly文档:
如果多个文件共享相同的相对路径(例如,多个依赖项JAR中名为application.conf的资源),则默认策略是验证所有候选项具有相同的内容,否则出错.可以使用以下内置策略之一或编写自定义策略在每个路径的基础上配置此行为:
MergeStrategy.deduplicate是上面描述的默认值MergeStrategy.first选择classpath顺序中的第一个匹配文件MergeStrategy.last挑选最后一个MergeStrategy.singleOrError在冲突时出现错误消息MergeStrategy.concat简单地连接所有匹配的文件并包含结果MergeStrategy.filterDistinctLines也可以连接,但在此过程中会留下重复的内容MergeStrategy.rename重命名源自jar文件的文件MergeStrategy.discard只是丢弃匹配的文件
通过这个我设置我的build.sbt如下:
import sbt._
import Keys._
import sbtassembly.Plugin._
import AssemblyKeys._
name := "my-project"
version := "0.1"
scalaVersion := "2.9.2"
crossScalaVersions := Seq("2.9.1","2.9.2")
//assemblySettings
seq(assemblySettings: _*)
resolvers ++= Seq(
"Typesafe Releases Repository" at "http://repo.typesafe.com/typesafe/releases/",
"Typesafe Snapshots Repository" at "http://repo.typesafe.com/typesafe/snapshots/",
"Sonatype Repository" at …Run Code Online (Sandbox Code Playgroud) 我正在使用Maven-Shade-Plugin来创建一个可运行的Uber-jar.根据本页的最后一帧,可以通过使用以下方式最小化jar的大小:
<configuration>
<minimizeJar>true</minimizeJar>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是,此功能未考虑log4j.properties文件中声明的类.因此,例如org.apache.log4j.appender.TimeAndSizeRollingAppender,即使它已在log4j.properties文件中声明,也不包含在Uber-jar中.
我相信我会遇到与Spring相同的问题.如果我的代码仅引用接口A并且我的Spring文件包含实现A的类B的实例化,那么B可能不会被添加到jar中,因为它不在代码中.
我怎么解决这个问题?
我需要将我的JRuby应用程序编译成一个独立的JAR文件.我怎样才能做到这一点?
将SBT项目的目标包设置为可执行jar文件的最佳方法是什么?
它需要捆绑scala-library.jar并为main-method设置清单.
我想阻止用户多次并行运行我的java应用程序.
为了防止这种情况,我在打开应用程序时创建了一个锁定文件,并在关闭应用程序时删除了锁定文件.
当应用程序运行时,您无法打开另一个jar实例.但是,如果通过任务管理器终止应用程序,则不会触发应用程序中的窗口关闭事件,也不会删除锁定文件.
如何确保锁定文件方法有效或我可以使用其他机制?
我查看了StackOverflow上可以找到的所有内容,但我找不到答案.我刚刚建立了一台新机器,我有一些项目可以在以前的安装中编译和构建.但我的新机器不会.一切似乎正在构建正确(没有构建错误,正确包含依赖项),但我的项目中的实际类文件(我写的代码)不包含在jar中.然后我创建了一个简单的helloWorld项目,其中包含一些最小的POM文件,可以看到问题仍然存在.我从命令行进行构建,将eclipse从等式中取出.
班级代码
package com.zoverge.utils;
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args) {
String message = args[0];
System.out.println(message);
}
}
Run Code Online (Sandbox Code Playgroud)
我的POM文件
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zoverge.utils</groupId>
<artifactId>helloworld</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>Hello World</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.java.version>1.6</project.build.java.version>
<org.apache.maven.plugins.maven-compiler-plugin.version>2.5.1</org.apache.maven.plugins.maven-compiler-plugin.version>
</properties>
<build>
<plugins>
<!-- Maven will compile our source java classes using the "project.build.java.version"
specified -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${org.apache.maven.plugins.maven-compiler-plugin.version}</version>
<configuration>
<source>${project.build.java.version}</source>
<target>${project.build.java.version}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.zoverge.utils.HelloWorld</mainClass>
</manifest>
</archive> …Run Code Online (Sandbox Code Playgroud) 我有一个简单的可执行Jar文件.我该如何为这个文件设置图标?在我的情况下,我使用标准的Jar图标,我想改变.

答案:使用Simple Build Tool制作独立jar似乎是我需要的,但它没有足够的信息给我,所以这是一个后续.
(1)如何根据需要调整答案?我不明白需要改变什么.
(2)我运行什么命令来创建独立jar?
(3)创建后,我在哪里可以找到它?
我尝试过的:
将链接的答案中的代码逐字地粘贴到我的:project/build/dsg.scala文件中.该文件现在有一个
class ForkRun(info: ProjectInfo) extends DefaultProject(info)
(从之前,用于在与SBT分开的VM中运行项目)和新的:
trait AssemblyProject extends BasicScalaProject
从链接的答案.
我也试过粘贴体(所有defs和lazy val的AssemblyProject成体ForkRun.
要创建一个jar我package在SBT提示符下运行并得到:
[info] Packaging ./target/scala_2.8.1/dsg_2.8.1-1.0.jar ...
[info] Packaging complete.
Run Code Online (Sandbox Code Playgroud)
所以我尝试dsg_2.8.1-1.0.jar通过shell 运行shell:
java -jar dsg_2.8.1-1.0.jar
Run Code Online (Sandbox Code Playgroud)
但我得到:
Failed to load Main-Class manifest attribute from
dsg_2.8.1-1.0.jar
Run Code Online (Sandbox Code Playgroud)
这可能是因为我的项目中有多个入口点吗?当我run从SBT提示执行时,我从列表中选择.也许我需要在创建包时指定默认值?
感觉这是一个愚蠢的问题,但我似乎无法弄明白.当我在Windows上运行*.jar文件时,它不会在任务管理器进程中出现.我怎么能终止它,我试过TASKKILL但它也不适合我.
executable-jar ×10
java ×6
jar ×3
sbt ×3
scala ×3
maven ×2
classpath ×1
deployment ×1
executable ×1
jruby ×1
maven-plugin ×1
package ×1
runtime ×1
sbt-assembly ×1