- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编译来自 this article explaining the Swing Application Framework (JSR 296) 的代码示例 3与 Gradle并使用 java
命令从命令行运行它。
我的目录布局是这样的:
├── build.gradle
└── src/
└── main/
└── java/
└── demo/
└── BasicSingleFrameApp.java
build.gradle
文件定义了对 appframework
的依赖:
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile 'org.jdesktop:appframework:1.0.3'
}
这是 BasicSingleFrameApp.java
文件,是上述文章示例的副本,通过包声明进行了增强:
package demo;
import org.jdesktop.application.*;
import javax.swing.*;
import java.awt.*;
public class BasicSingleFrameApp extends SingleFrameApplication {
JLabel label;
@Override
protected void startup() {
getMainFrame().setTitle("BasicSingleFrameApp");
label = new JLabel("Hello, world!");
label.setFont(new Font("SansSerif", Font.PLAIN, 22));
show(label);
}
public static void main(String[] args) {
Application.launch(BasicSingleFrameApp.class, args);
}
}
使用 gradle build
编译工作正常,没有错误。
但是当我尝试运行 BasicSingleFrameApp
时
$ java -cp build/classes/main/ demo.BasicSingleFrameApp
我收到错误信息:
Error: Could not find or load main class demo.BasicSingleFrameApp
当我用简单的“Hello, world!”替换 BasicSingleFrameApp
类时没有依赖项的打印类,一切正常。
我很困惑,因为根据我的理解,我正确地设置了类路径,但我不明白为什么找不到 main
方法(具有正确的签名)。
这是我的 Java 版本:
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
我运行的是 Mac OS X Yosemite 10.10.2。
最佳答案
好吧,@chuchikaeschtli 帮助我找到了问题的核心,即 Gradle 管理编译的依赖项并报告在运行时这样做,但是需要更多的手动任务才能使这些依赖项在运行时可用。
仍然让我感到困惑的是我收到的不直观的错误消息:
Error: Could not find or load main class demo.BasicSingleFrameApp
我本以为会出现与运行时缺少依赖项有关的问题,以报告类似
的错误error: package org.jdesktop.application does not exist
这是我在编译时缺少这些依赖项时遇到的那种错误。
当 Gradle 向我提供以下关于运行时依赖项的报告时(通过运行 gradle dependencies
),我认为 Gradle 以某种方式管理了这些:
compile - Compile classpath for source set 'main'.
\--- org.jdesktop:appframework:1.0.3
\--- org.jdesktop:swing-worker:1.1
…
runtime - Runtime classpath for source set 'main'.
\--- org.jdesktop:appframework:1.0.3
\--- org.jdesktop:swing-worker:1.1
…
最后,在知道是缺少运行时依赖的问题后,我找到了几种提供它们的方法,我将分享。
第一个解决方案:链接到缓存
如 this Stackoverflow answer 中所述,Gradle 在 $HOME/.gradle
中缓存依赖项,但它们的实际路径很棘手。答案描述了一个小的 Gradle 任务,它输出缓存中每个依赖项的完整路径(在本例中为 compile
配置,这是我需要的):
task showMeCache << {
configurations.compile.each { println it }
}
在我的例子中,gradle showMeCache
报告:
$HOME/.gradle/caches/modules-2/files-2.1/org.jdesktop/appframework/1.0.3/338045feff6e61df237aafd11b6f3fe1a3b4e60e/appframework-1.0.3.jar
$HOME/.gradle/caches/modules-2/files-2.1/org.jdesktop/swing-worker/1.1/dc9f8d6f7236087924aad28fbec794a087dd1b3d/swing-worker-1.1.jar
这些是又长又讨厌的文件路径,但我能够构建一个 java
命令,它以@chuchikaeschtli 建议的样式工作:
java \
-cp build/classes/main/\
:$HOME/.gradle/caches/modules-2/files-2.1/org.jdesktop/appframework/1.0.3/338045feff6e61df237aafd11b6f3fe1a3b4e60e/appframework-1.0.3.jar\
:$HOME/.gradle/caches/modules-2/files-2.1/org.jdesktop/swing-worker/1.1/dc9f8d6f7236087924aad28fbec794a087dd1b3d/swing-worker-1.1.jar \
demo.BasicSingleFrameApp
这行得通,但当然感觉不太“对”。但这有助于理解问题:这实际上是缺少依赖项 jar 的问题。
第二种方案:同步依赖到build
目录
在 Using the Sync task of the Gradle User Guide 部分中,它明确使用了一个示例来描述手头问题的更好解决方案:
Here is an example which maintains a copy of the project's runtime dependencies in the build/libs directory.
task libs(type: Sync) {
from configurations.runtime
into "$buildDir/libs"
}
在使用 gradle libs
运行此任务后,我能够构建一个更简单的工作 java
命令:
java -cp build/classes/main/:build/libs/appframework-1.0.3.jar:build/libs/swing-worker-1.1.jar demo.BasicSingleFrameApp
请记住:默认情况下,这些依赖项并未同步到 build
目录中!
方案三:使用Gradle运行应用
有了 Application Plugin,Gradle 本身就为运行应用程序提供了一个方便的解决方案。将这两行添加到我的 build.gradle
apply plugin:'application'
mainClassName = 'demo.BasicSingleFrameApp'
我能够通过 gradle run
成功启动应用程序。迄今为止最简单的解决方案!
请注意,应用程序插件还提供了一个名为 installDist
的任务,该任务在 build/install
中创建了一个可运行的应用程序及其所有依赖项的分发版,并包含了启动脚本UNIX 和 Windows 系统。这样做的好处是不需要 Gradle 来执行应用程序。
此外,如果您喜欢应用程序插件的 gradle run
任务,但担心 Gradle 在目标系统上是否可用,请查看 Gradle Wrapper。
第四种解决方案:创建 One-JAR、Fat Jar 或 Uber Jar
似乎存在 Gradle-only ways 和 Gradle plugins 可以帮助创建这些包含应用程序所需的所有依赖项的 jar。
在 gradle-one-jar-Plugin 的情况下,然后可以使用 java
命令启动应用程序,例如:
java -jar build/libs/YOUR_APP_NAME-standalone.jar
关于java - 通过 java 命令运行具有依赖项的 Gradle 编译 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29379736/
我正在通过 labrepl 工作,我看到了一些遵循此模式的代码: ;; Pattern (apply #(apply f %&) coll) ;; Concrete example user=> (a
我从未向应用商店提交过应用,但我会在不久的将来提交。 到目前为止,我对为 iPhone 而非 iPad 进行设计感到很自在。 我了解,通过将通用PAID 应用放到应用商店,客户只需支付一次就可以同时使
我有一个应用程序,它使用不同的 Facebook 应用程序(2 个不同的 AppID)在 Facebook 上发布并显示它是“通过 iPhone”/“通过 iPad”。 当 Facebook 应用程序
我有一个要求,我们必须通过将网站源文件保存在本地 iOS 应用程序中来在 iOS 应用程序 Webview 中运行网站。 Angular 需要服务器来运行应用程序,但由于我们将文件保存在本地,我们无法
所以我有一个单页客户端应用程序。 正常流程: 应用程序 -> OAuth2 服务器 -> 应用程序 我们有自己的 OAuth2 服务器,因此人们可以登录应用程序并获取与用户实体关联的 access_t
假设我有一个安装在用户设备上的 Android 应用程序 A,我的应用程序有一个 AppWidget,我们可以让其他 Android 开发人员在其中以每次安装成本为基础发布他们的应用程序推广广告。因此
Secrets of the JavaScript Ninja中有一个例子它提供了以下代码来绕过 JavaScript 的 Math.min() 函数,该函数需要一个可变长度列表。 Example:
当我分别将数组和对象传递给 function.apply() 时,我得到 NaN 的 o/p,但是当我传递对象和数组时,我得到一个数字。为什么会发生这种情况? 由于数组也被视为对象,为什么我无法使用它
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章ASP转换格林威治时间函数DateDiff()应用由作者收集整理,如果你
我正在将列表传递给 map并且想要返回一个带有合并名称的 data.frame 对象。 例如: library(tidyverse) library(broom) mtcars %>% spl
我有一个非常基本的问题,但我不知道如何实现它:我有一个返回数据框,其中每个工具的返回值是按行排列的: tmp<-as.data.frame(t(data.frame(a=rnorm(250,0,1)
我正在使用我的 FB 应用创建群组并邀请用户加入我的应用群组,第一次一切正常。当我尝试创建另一个组时,出现以下错误: {"(OAuthException - #4009) (#4009) 在有更多用户
我们正在开发一款类似于“会说话的本”应用程序的 child 应用程序。它包含大量用于交互式动画的 JPEG 图像序列。 问题是动画在 iPad Air 上播放正常,但在 iPad 2 上播放缓慢或滞后
我关注 clojure 一段时间了,它的一些功能非常令人兴奋(持久数据结构、函数式方法、不可变状态)。然而,由于我仍在学习,我想了解如何在实际场景中应用,证明其好处,然后演化并应用于更复杂的问题。即,
我开发了一个仅使用挪威语的应用程序。该应用程序不使用本地化,因为它应该仅以一种语言(挪威语)显示。但是,我已在 Info.plist 文件中将“本地化 native 开发区域”设置为“no”。我还使用
读完 Anthony's response 后上a style-related parser question ,我试图说服自己编写单体解析器仍然可以相当紧凑。 所以而不是 reference ::
multicore 库中是否有类似 sapply 的东西?还是我必须 unlist(mclapply(..)) 才能实现这一点? 如果它不存在:推理是什么? 提前致谢,如果这是一个愚蠢的问题,我们深表
我喜欢在窗口中弹出结果,以便更容易查看和查找(例如,它们不会随着控制台继续滚动而丢失)。一种方法是使用 sink() 和 file.show()。例如: y <- rnorm(100); x <- r
我有一个如下所示的 spring mvc Controller @RequestMapping(value="/new", method=RequestMethod.POST) public Stri
我正在阅读 StructureMap关于依赖注入(inject),首先有两部分初始化映射,具体类类型的接口(interface),另一部分只是实例化(请求实例)。 第一部分需要配置和设置,这是在 Bo
我是一名优秀的程序员,十分优秀!