小编Chr*_*ian的帖子

Java中的资源,URI,URL,路径和文件有什么区别?

我现在正在查看一段Java代码,它将路径作为String并使用其获取URL URL resource = ClassLoader.getSystemClassLoader().getResource(pathAsString);,然后调用String path = resource.getPath()并最终执行new File(path);.

哦,还有电话URL url = resource.toURI();String file = resource.getFile().

我现在完全糊涂了 - 主要是因为术语,我猜.有人可以带我解决这些差异,或提供一些防伪材料的链接吗?特别是URI到URL和资源到文件?对我来说,感觉它们应该是相同的东西,分别......

之间的差异getFile(),并getPath()在此说明:有什么url.getFile()和的getPath()有什么区别?(有趣的是他们似乎都回归了Strings,这可能会增加我的心态...)

现在,如果我有一个引用jar文件中的类或包的定位器,那两个(即路径文件串)是否会有所不同?

resource.toString()jar:file:/C:/path/to/my.jar!/com/example/毕竟会给你(注意感叹号).

Java中的URIURL 之间的区别是前者不编码空格吗?参看 Java中存在冲突的文件,URI和URL(这个答案很好地解释了这两个术语之间的一般概念差异:URI识别和URL定位;)

最后 - 最重要的是 - 为什么我需要File对象; 为什么资源(URL)不足够?(还有一个Resource对象吗?)

对不起,如果这个问题有点无组织; 它只是反映了我的困惑...... :)

java url terminology

88
推荐指数
3
解决办法
3万
查看次数

发生在与Java中的易失性字段和同步块的关系之前 - 以及它们对非易失性变量的影响?

我对线程概念还很陌生,并尝试更多地了解它.最近,我发现了一篇关于Jeremy Manson撰写的" Java中易失手段"的博客文章,他写道:

当一个线程写入一个volatile变量,而另一个线程看到该写入时,第一个线程告诉第二个线程关于内存的所有内容,直到它执行对该volatile变量的写入.[...] 所有的由线程1看到的存储内容,才写信给[volatile] ready,必须是可见的主题2,它读取值后true进行ready.[自己强调]

现在,这是否意味着在写入volatile变量时,线程1的内存中保存的所有变量(volatile或not)将在读取volatile变量后变为可见?如果是这样,是否可以从官方Java文档/ Oracle源代码中将该语句拼凑起来?从哪个版本的Java开始这个工作?

特别是,如果所有线程共享以下类变量:

private String s = "running";
private volatile boolean b = false;
Run Code Online (Sandbox Code Playgroud)

并且线程1首先执行以下操作:

s = "done";
b = true;
Run Code Online (Sandbox Code Playgroud)

然后线程2执行(在线程1写入volatile字段之后):

boolean flag = b; //read from volatile
System.out.println(s);
Run Code Online (Sandbox Code Playgroud)

这会保证打印"完成"吗?

如果我将写入和读取放入块中而不是声明b,会发生什么?volatilesynchronized

另外,在题为" 线程之间是否共享静态变量? "的讨论中,@ TREE 写道:

不要使用volatile来保护多个共享状态.

为什么?(对不起;我还没有就其他问题发表评论,或者我会在那里问过......)

java multithreading volatile synchronized

49
推荐指数
3
解决办法
8383
查看次数

npm,bower,gulp,Yeoman和grunt有什么好处?

我是一个后端开发人员,对npm,bower,gulp,grunt和Yeoman有点困惑.每当我问某人他们的目的是什么时,答案往往归结为依赖经理 - 对所有人而言.当然,我们不需要四种不同的工具,它们都是一样的吗?

有人可以用尽可能少的句子来解释每个有益的东西- 如果可能的话,每个工具只使用一个,使用五岁的语言(具有开发技能)可以理解吗?

例如:

  • SVN存储,管理和跟踪源代码的变化

我过去曾经使用过maven,Jenkins,nexus和ant; 也许您可以将上述工具与这些工具进行比较?

也可以随意添加其他前端工具到列表中.

这是我到目前为止所发现的 - 不确定它是否正确,但是:

  • 前端开发/ JS库的bower依赖管理器使用平面依赖列表
  • node.js服务器的npm依赖管理器可以解析传递依赖/依赖树
  • grunt运行任务,就像Jenkins一样,但是命令行上的位置
  • Yeoman提供了脚手架,即骨架项目
  • gulp与grunt相同,但仅用js编写
  • js应用程序的node.js服务器?
  • git分散的SCM/VCS,与svn/cvs相对应

我接近了吗?:)

javascript npm tooling gruntjs bower

30
推荐指数
2
解决办法
7458
查看次数

当本地和远程存储库中存在具有不同时间戳的SNAPSHOTS时,Maven如何解决SNAPSHOT依赖关系?

假设我有一个A依赖于项目的开发项目B- 该项目目前正在开发中,尚未发布.

所以,在APOM文件中,我有以下部分:

<dependency>
  <groupId>com.example</groupId>
  <artifactId>project-b</artifactId>
  <version>1.0.0-SNAPSHOT</version>
<\dependency>
Run Code Online (Sandbox Code Playgroud)

在工作中,我们有一个远程仓库(Nexus)和一个CI盒(运行Jenkins).

当我的同事改变B并提交给SVN时,Jenkins会选择更改,编译并将其放入远程仓库.大约在那个时候,我可能会B在本地打开,进行更改,编译并将其安装到我的本地仓库中.

B当我尝试mvn clean install A本地时,Maven现在如何解决?

  • 它是否总是默认为我的本地SNAPSHOT如果找到一个?
  • 它总是默认为远程SNAPSHOT吗?
  • 它会看时间戳吗?
  • 它会做些不同的事吗?

前几天我们弄得一团糟,基本上不得不手动删除本地存储库,以确保我们得到了我们期望获得的版本.所以我现在想弄清楚究竟发生了什么.(因此,如果你有详细文档中的地点的链接,那也将非常感激...)在本地,我有时在我的存储库文件夹中有一些SNAPSHOT版本,一个没有,有几个用什么看起来像SNAPSHOT文件名部分之后的时间戳...

snapshot dependency-management pom.xml maven dependency-resolver

16
推荐指数
1
解决办法
1万
查看次数

您是否可以从命令行在包中运行所有JUnit测试而无需明确列出它们?

如果测试类和JUnit都在类路径上,则可以从命令行运行JUnit测试,如下所示:

java org.junit.runner.JUnitCore TestClass1 TestClass2
Run Code Online (Sandbox Code Playgroud)

现在,有没有办法在包(和子包)中运行所有测试?

我正在寻找类似的东西

java org.junit.runner.JUnitCore com.example.tests.testsIWantToRun.*
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法(不涉及maven或ant)?

java junit command-line unit-testing

14
推荐指数
1
解决办法
9911
查看次数

执行shell命令框后,Jenkins的工作目录是什么?

我正在看詹金斯的工作并试图理解它.

我的Build部分中有一个Execute shell命令框:

> mkdir mydir 
> cd mydir
> 
> svn export --force https://example.com/repo/mydir .
Run Code Online (Sandbox Code Playgroud)

当Jenkins完成执行该命令后,继续进行下一个构建步骤,它的工作目录是什么? workspece-root/还是workspace-root/mydir

下一步,我有Invoke顶级Maven目标(仍然在Build部分).

我真正想知道的是:为什么要成功执行?
是因为Jenkins workspace-root/在执行shell命令框后自动移回文件夹,还是因为下一个作业是"顶级"作业,而Jenkins因此更改回workspace-root/

working-directory jenkins

12
推荐指数
1
解决办法
4万
查看次数

为什么在实现Runnable时使用Thread.currentThread().isInterrupted()而不是Thread.interrupted()?

在stackoverflow上,我经常看到使用Thread.currentThread().isInterrupted().Runnable在while循环中实现和使用它时,如下所示:

public void run() {
  while(!Thread.currentThread().isInterrupted()) { ... }
}
Run Code Online (Sandbox Code Playgroud)

是否有任何不同使用Thread.interrupted()(除了interrupted使用时清除标志interrupted())?

我也见过Thread.currentThread().interrupted().这是正确的使用方式,还是Thread.interrupted()足够的?

java multithreading interrupt runnable

11
推荐指数
2
解决办法
6971
查看次数

哪些字符不能直接映射到Cp1252到UTF-8?

我在几个stackoverflow的答案中读到,当从Cp1252(又名Windows-1252;它们是相同的,不是吗?)转换为UTF-8时,某些字符不能直接映射(或者甚至是"不可映射的"),例如:https://stackoverflow.com/a/23399926/2018047

有人可以对此有所了解吗?这是否意味着如果我将源代码从cp1252批量/批量转换为utf-8,我会得到一些最终会成为垃圾的字符?

utf-8 utf cp1252 character-encoding codepages

11
推荐指数
1
解决办法
4万
查看次数

如何创建Cucumber DataTable?

我想使用Java(而不是Gherkin)手动设置Cucumber DataTable.

在小黄瓜,我的桌子看起来像这样:

| h1 | h2 |
| v1 | v2 |
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的Java看起来像这样:

List<String> raw = Arrays.asList( "v1", "v2");
DataTable dataTable = DataTable.create(raw, Locale.getDefault(), "h1", "h2");
Run Code Online (Sandbox Code Playgroud)

我得到的是带有标题但没有内容的DataTable.它也比预期的要长:

  | h1| h2 |
  |   |    |
  |   |    |
Run Code Online (Sandbox Code Playgroud)

我确信解决方案必须相当简单,但我现在有点不知所措.拿桌子需要做什么?

cucumber gherkin cucumber-jvm

10
推荐指数
1
解决办法
3万
查看次数

深拷贝或不深拷贝 - 无论如何,为什么 ngrx 的状态应该是不可变的?

我是 ngrx 的新手(并且从未使用过 redux)并且我试图理解这一切 - 特别是是否需要状态的深层副本。这是我到目前为止所学到的以及仍然让我感到困惑的内容(以粗体显示)。

该NGRX文档状态

每个 reducer 函数都会获取最新调度的 Action、当前状态,并确定是返回新修改的状态还是原始状态。

他们还指出状态转换需要不变地发生——如果你改变状态,它需要在一个副本上:

每个动作都不变地处理状态转换。这意味着状态转换不会修改原始状态,而是使用扩展运算符返回一个新的状态对象。

但是,他们没有说明为什么这是必要的,除了促进引用完整性(我不太确定如何确保您的引用指向数据 - 我只知道关系数据库上下文中的术语 - 全部发挥作用):

spread 语法将属性从当前状态复制到对象中,创建一个新的引用。这确保了每次更改都会产生一个新状态,从而保持更改的纯度。这也促进了引用完整性,确保在发生状态更改时丢弃旧引用。

不过,那(参照完整性和上面的部分)并没有真正解释为什么这是必要的。
在 SO 的其他地方,我发现一条评论表明它允许将 Angular 的更改检测策略更改为OnPush.

(我也有点困惑,如果一个动作可以触发多个 reducer,结果状态副本可以合并,但这显然是由每个 reducer 专门处理单独的状态切片和 redux 意识到这一点来解释的。)

不过,重要的事情似乎是,状态的浅或深副本创建了一个新的 reference,这意味着 ngrx 正在向其订阅者推送更改:

如果返回的对象引用发生了变化,它将触发有关特定状态的任何相关 RxJS 状态订阅。使用一些好的 ngrx 选择器可以最小化触发哪些订阅。

一般来说,Redux FAQ列出了为什么不变性是一件好事以及为什么 redux 需要它
提高性能、更简单的调试、更容易推理、更安全的数据处理、浅层相等性检查

他们还说它

使复杂的变化检测技术能够简单且廉价地实施,确保更新 DOM 的计算成本高昂的过程仅在绝对必须时发生

正如刚刚指出的(作为不变性的要求之一)redux 会进行浅层相等性检查

然而,Nrgx 的文档推荐深度克隆(另外,如果副本引用旧对象,状态并不是真正不可变的,我想):

注意:spread 操作符只做浅拷贝,不处理深度嵌套的对象。您需要复制对象中的每个级别以确保不变性。有处理深度复制的库,包括 lodash 和 immer。 …

state immutability redux ngrx angular

9
推荐指数
1
解决办法
2226
查看次数